|
@@ -0,0 +1,81 @@
|
|
|
+
|
|
|
+
|
|
|
+package tree
|
|
|
+
|
|
|
+type Node struct {
|
|
|
+ Child *Node
|
|
|
+ After *Node
|
|
|
+ Before *Node
|
|
|
+ Parent *Node
|
|
|
+ Data interface{}
|
|
|
+}
|
|
|
+
|
|
|
+func NewEmpty() *Node {
|
|
|
+ return &Node{}
|
|
|
+}
|
|
|
+
|
|
|
+func New(parent *Node, data interface{}) *Node {
|
|
|
+ node := NewEmpty()
|
|
|
+ node.Parent = parent
|
|
|
+ node.Data = data
|
|
|
+ return node
|
|
|
+}
|
|
|
+
|
|
|
+func (me *Node) LastSibling() *Node {
|
|
|
+ res := me
|
|
|
+ for res != nil && res.After != nil {
|
|
|
+ res = res.After
|
|
|
+ }
|
|
|
+ return res
|
|
|
+}
|
|
|
+
|
|
|
+func (me *Node) InsertSibling(sibling *Node) *Node {
|
|
|
+ after := me.After
|
|
|
+ me.After = sibling
|
|
|
+ sibling.Before = me
|
|
|
+ sibling.After = after
|
|
|
+ sibling.Parent = me.Parent
|
|
|
+ return sibling
|
|
|
+}
|
|
|
+
|
|
|
+func (me *Node) AppendSibling(sibling *Node) *Node {
|
|
|
+ return me.LastSibling().InsertSibling(sibling)
|
|
|
+}
|
|
|
+
|
|
|
+func (me *Node) AppendChild(child *Node) *Node {
|
|
|
+ child.Parent = me
|
|
|
+ if me.Child == nil {
|
|
|
+ me.Child = child
|
|
|
+ } else {
|
|
|
+ me.Child.AppendSibling(child)
|
|
|
+ }
|
|
|
+ return child
|
|
|
+}
|
|
|
+
|
|
|
+func (me *Node) NewSibling(data interface{}) *Node {
|
|
|
+ node := New(me.Parent, data)
|
|
|
+ return me.AppendSibling(node)
|
|
|
+}
|
|
|
+
|
|
|
+func (me *Node) NewChild(data interface{}) *Node {
|
|
|
+ node := New(me, data)
|
|
|
+ return me.AppendChild(node)
|
|
|
+}
|
|
|
+
|
|
|
+func (me *Node) Walk(walker func(me *Node) *Node) *Node {
|
|
|
+ node := me
|
|
|
+ if found := walker(node); found != nil {
|
|
|
+ return found
|
|
|
+ }
|
|
|
+ if me.Child != nil {
|
|
|
+ if found := me.Child.Walk(walker); found != nil {
|
|
|
+ return found
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if me.After != nil {
|
|
|
+ if found := me.After.Walk(walker); found != nil {
|
|
|
+ return found
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return nil
|
|
|
+}
|