`collections.heapqueue` does mostly what you want. You would have to remove 
duplicates yourself, like below, but probably with an iterator called something 
like `unique`. 
    
    
    import collections.heapqueue
    
    var heap = newHeapQueue[int]()
    let data = [1, 3, 5, 1, 7, 9, 2, 4, 6, 6, 8, 0]
    for item in data:
      push(heap, item)
    
    var last = heap.pop() #NOTE: assumes heap.len >= 1
    echo last
    while heap.len > 0:
      let next = heap.pop()
      if next != last:
        echo next
      last = next
    

Note that this does actually store duplicates until the final iteration because 
heaps do not possess a fast { i.e. O(log-set-size) } test for membership. So, 
if you had a great many copies and/or memory constraints that could be an 
issue. You didn't mention how high the duplication rate would be, but I bet 
something like the above is fast enough.

A more memory optimal structure for this is probably a simple B-Tree or some 
kind of balanced binary tree (less cache friendly than a B-Tree, but typically 
more available/implemented more often) or possibly an adaptation of 
`collections.critbits` or some other digital search tree. I think there is a 
red-black tree in Nim floating around.

Reply via email to