aboutsummaryrefslogtreecommitdiff
path: root/plugin/file/tree/print.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/file/tree/print.go')
-rw-r--r--plugin/file/tree/print.go62
1 files changed, 62 insertions, 0 deletions
diff --git a/plugin/file/tree/print.go b/plugin/file/tree/print.go
new file mode 100644
index 000000000..bd86ef690
--- /dev/null
+++ b/plugin/file/tree/print.go
@@ -0,0 +1,62 @@
+package tree
+
+import "fmt"
+
+// Print prints a Tree. Main use is to aid in debugging.
+func (t *Tree) Print() {
+ if t.Root == nil {
+ fmt.Println("<nil>")
+ }
+ t.Root.print()
+}
+
+func (n *Node) print() {
+ q := newQueue()
+ q.push(n)
+
+ nodesInCurrentLevel := 1
+ nodesInNextLevel := 0
+
+ for !q.empty() {
+ do := q.pop()
+ nodesInCurrentLevel--
+
+ if do != nil {
+ fmt.Print(do.Elem.Name(), " ")
+ q.push(do.Left)
+ q.push(do.Right)
+ nodesInNextLevel += 2
+ }
+ if nodesInCurrentLevel == 0 {
+ fmt.Println()
+ }
+ nodesInCurrentLevel = nodesInNextLevel
+ nodesInNextLevel = 0
+ }
+ fmt.Println()
+}
+
+type queue []*Node
+
+// newQueue returns a new queue.
+func newQueue() queue {
+ q := queue([]*Node{})
+ return q
+}
+
+// push pushes n to the end of the queue.
+func (q *queue) push(n *Node) {
+ *q = append(*q, n)
+}
+
+// pop pops the first element off the queue.
+func (q *queue) pop() *Node {
+ n := (*q)[0]
+ *q = (*q)[1:]
+ return n
+}
+
+// empty returns true when the queue contains zero nodes.
+func (q *queue) empty() bool {
+ return len(*q) == 0
+}