MCPcopy Create free account
hub / github.com/Effect-TS/effect / TrieIterator

Class TrieIterator

packages/effect/src/internal/trie.ts:78–134  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

76}
77
78class TrieIterator<in out V, out T> implements IterableIterator<T> {
79 stack: Array<[Node<V>, string, boolean]> = []
80 readonly trie: TrieImpl<V>
81 readonly f: TraversalMap<string, V, T>
82 readonly filter: TraversalFilter<string, V>
83
84 constructor(
85 trie: TrieImpl<V>,
86 f: TraversalMap<string, V, T>,
87 filter: TraversalFilter<string, V>
88 ) {
89 this.trie = trie
90 this.f = f
91 this.filter = filter
92 const root = trie._root !== undefined ? trie._root : undefined
93 if (root !== undefined) {
94 this.stack.push([root, "", false])
95 }
96 }
97
98 next(): IteratorResult<T> {
99 while (this.stack.length > 0) {
100 const [node, keyString, isAdded] = this.stack.pop()!
101
102 if (isAdded) {
103 const value = node.value
104 if (value !== undefined) {
105 const key = keyString + node.key
106 if (this.filter(key, value.value)) {
107 return { done: false, value: this.f(key, value.value) }
108 }
109 }
110 } else {
111 this.addToStack(node, keyString)
112 }
113 }
114
115 return { done: true, value: undefined }
116 }
117
118 addToStack(node: Node<V>, keyString: string) {
119 if (node.right !== undefined) {
120 this.stack.push([node.right, keyString, false])
121 }
122 if (node.mid !== undefined) {
123 this.stack.push([node.mid, keyString + node.key, false])
124 }
125 this.stack.push([node, keyString, true])
126 if (node.left !== undefined) {
127 this.stack.push([node.left, keyString, false])
128 }
129 }
130
131 [Symbol.iterator](): IterableIterator<T> {
132 return new TrieIterator(this.trie, this.f, this.filter)
133 }
134}
135

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected