-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtree.go
More file actions
116 lines (102 loc) · 1.97 KB
/
tree.go
File metadata and controls
116 lines (102 loc) · 1.97 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
package structs
import (
"reflect"
)
type Node struct {
name string
parent *Node
children []*Node
data interface{}
}
func NewNode(name string, data interface{}) *Node {
return &Node{name: name, data: data}
}
func (n *Node) Name() string {
return n.name
}
func (n *Node) NoChildren() int {
return len(n.children)
}
func (n *Node) Parent() *Node {
return n.parent
}
// func (n *Node) AllParents() []*Node {
// if parent := n.parent; parent == nil {
// return nil
// } else {
// return append(parent.AllParents(), parent)
// }
// }
func (n *Node) Root() *Node {
root := n.parent
for {
if root.parent == nil {
return root
}
if root != nil {
root = root.parent
}
}
}
func (n *Node) Flatten() []*Node {
nodes := []*Node{}
for _, child := range n.children {
nodes = append(nodes, child)
nodes = append(nodes, child.Flatten()...)
}
return nodes
}
func (n *Node) GetChild(path []string) *Node {
found := &Node{}
children := n.children
for _, name := range path {
current := &Node{}
for _, c := range children {
if c.name == name {
current = c
break
}
}
if current.name == name {
found = current
children = current.children
} else {
return found
}
}
return found
}
func (n *Node) SetName(name string) {
n.name = name
}
func (n *Node) SetData(data interface{}) {
n.data = data
}
func (n *Node) AddChild(c *Node) bool {
if reflect.DeepEqual(n, c) {
// cannot add itself as child
return false
}
for _, child := range n.children {
if child.name == c.name {
// cannot have 2 children with the same name
return false
}
}
c.parent = n
n.children = append(n.children, c)
return true
}
func (n *Node) DelChild(c *Node) bool {
for i, child := range n.children {
if reflect.DeepEqual(child, c) {
n.children = append(n.children[:i], n.children[i+1:]...)
for _, orphan := range c.children {
orphan.parent = n
n.children = append(n.children, orphan)
}
return true
}
}
return false
}