From 34b8d8ff1f9d65c08a9156d72f08cf548183c6f4 Mon Sep 17 00:00:00 2001 From: JP Appel Date: Sun, 27 Apr 2025 00:49:27 -0400 Subject: Large commit; many features --- pkg/query/query.go | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 pkg/query/query.go (limited to 'pkg/query/query.go') 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 + } +} -- cgit v1.2.3