| 643 | >(2, (self, key) => lessThanEqual(self, key, Direction.Forward)) |
| 644 | |
| 645 | const lessThanEqual = <K, V>( |
| 646 | self: RBT.RedBlackTree<K, V>, |
| 647 | key: K, |
| 648 | direction: RBT.RedBlackTree.Direction |
| 649 | ): Iterable<[K, V]> => { |
| 650 | return { |
| 651 | [Symbol.iterator]: () => { |
| 652 | const cmp = (self as RedBlackTreeImpl<K, V>)._ord |
| 653 | let node = (self as RedBlackTreeImpl<K, V>)._root |
| 654 | const stack = [] |
| 655 | let last_ptr = 0 |
| 656 | while (node !== undefined) { |
| 657 | const d = cmp(key, node.key) |
| 658 | stack.push(node) |
| 659 | if (d >= 0) { |
| 660 | last_ptr = stack.length |
| 661 | } |
| 662 | if (d < 0) { |
| 663 | node = node.left |
| 664 | } else { |
| 665 | node = node.right |
| 666 | } |
| 667 | } |
| 668 | stack.length = last_ptr |
| 669 | return new RedBlackTreeIterator(self, stack, direction) |
| 670 | } |
| 671 | } |
| 672 | } |
| 673 | |
| 674 | /** @internal */ |
| 675 | export const forEach = dual< |