diff options
Diffstat (limited to 'llparse-frontend/src/enumerator.ts')
-rw-r--r-- | llparse-frontend/src/enumerator.ts | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/llparse-frontend/src/enumerator.ts b/llparse-frontend/src/enumerator.ts new file mode 100644 index 0000000..f2940a2 --- /dev/null +++ b/llparse-frontend/src/enumerator.ts @@ -0,0 +1,23 @@ +import { Node } from './node'; +import { IWrap } from './wrap'; + +export class Enumerator { + public getAllNodes(root: IWrap<Node>): ReadonlyArray<IWrap<Node>> { + const nodes: Set<IWrap<Node>> = new Set(); + const queue = [ root ]; + + while (queue.length !== 0) { + const node = queue.pop()!; + for (const slot of node.ref.getSlots()) { + if (nodes.has(slot.node)) { + continue; + } + + nodes.add(slot.node); + queue.push(slot.node); + } + } + + return Array.from(nodes); + } +} |