Advertisement
sschwarzer

lazytree.nim

May 26th, 2020
79
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Nim 1.06 KB | None | 0 0
  1. # If `nextChildIndex` is `rootIndex`, this means the next yielded node will be
  2. # the root node. The actual value is quite intentional because `inc`ing it will
  3. # give the first child index 0.
  4. const rootIndex = -1
  5.  
  6. type
  7.   Iterator[N] = ref object
  8.     root: N
  9.     nextChildIndex: int
  10.  
  11. proc newIterator[N](root: N): Iterator[N] =
  12.   Iterator[N](root: root, nextChildIndex: rootIndex)
  13.  
  14. func hasNextNode[N](iter: Iterator[N]): bool =
  15.   ## Return `true` if the iterator has any more child nodes to yield.
  16.   ## Otherwise return `false`.
  17.   if iter.nextChildIndex == rootIndex:
  18.     return true
  19.   return iter.nextChildIndex < len(iter.root)
  20.  
  21. proc nextNode[N](iter: Iterator[N]): N =
  22.   ## Return next node from `iter`.
  23.   ## Precondition: `hasNextNode` must have returned `true`.
  24.   if iter.nextChildIndex == rootIndex:
  25.     result = iter.root
  26.   else:
  27.     result = iter.root[iter.nextChildIndex]
  28.   inc(iter.nextChildIndex)
  29.  
  30. iterator treeIter*[N](root: N): N =
  31.   var rootIterator = newIterator[N](root)
  32.   while rootIterator.hasNextNode():
  33.     yield rootIterator.nextNode()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement