diff options
| author | JP Appel <jeanpierre.appel01@gmail.com> | 2025-04-27 00:49:27 -0400 |
|---|---|---|
| committer | JP Appel <jeanpierre.appel01@gmail.com> | 2025-04-27 00:49:27 -0400 |
| commit | 34b8d8ff1f9d65c08a9156d72f08cf548183c6f4 (patch) | |
| tree | a00fa0410a7bcde125a37b50b3a4956c838fa569 /pkg/query/query.go | |
| parent | 42527fdb0aca0d30652bb3052b80ab75ab057572 (diff) | |
Large commit; many features
Diffstat (limited to 'pkg/query/query.go')
| -rw-r--r-- | pkg/query/query.go | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/pkg/query/query.go b/pkg/query/query.go new file mode 100644 index 0000000..b712370 --- /dev/null +++ b/pkg/query/query.go @@ -0,0 +1,50 @@ +package query + + +type Node struct { + Parent *Node + Children []*Node + Token +} + +type AST struct { + root Node + size uint64 +} + +// Walk an ast depth first +func (T AST) dfWalk() func() (*Node, bool) { + stack := nodeStack{make([]*Node, 0, T.size)} + stack.Push(&T.root) + + return func() (*Node, bool) { + n := stack.Pop() + for _, child := range n.Children { + stack.Push(child) + } + + if stack.IsEmpty() { + return n, false + } + return n, true + } +} + +// Walk an ast breadth first +func (T AST) bfWalk() func() (*Node, bool) { + queue := nodeQueue{} + queue.buf = make([]*Node, 0, T.size) + queue.Enqueue(&T.root) + + return func() (*Node, bool) { + n, err := queue.Dequeue() + if err != nil { + return nil, false + } + + for _, child := range n.Children { + queue.Enqueue(child) + } + return n, true + } +} |
