-
Notifications
You must be signed in to change notification settings - Fork 0
/
tree.go
107 lines (83 loc) · 1.61 KB
/
tree.go
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
package main
import (
"fmt"
"sort"
"strings"
)
type Tree map[string]Tree
type Type int
func (tree Tree) Add(path string) {
fragments := strings.Split(path, "/")
if fragments[len(fragments)-1] == "" {
fragments = fragments[:len(fragments)-1]
}
fragments = append([]string{"/"}, fragments...)
tree.add(fragments)
}
func (tree Tree) Print() {
tree.print(true, "")
}
func (tree Tree) add(fragments []string) {
if len(fragments) == 0 {
return
}
nextTree, ok := tree[fragments[0]]
if !ok {
nextTree = Tree{}
tree[fragments[0]] = nextTree
}
nextTree.add(fragments[1:])
}
func (tree Tree) print(root bool, padding string) {
var index = 0
var keys []string
for k := range tree {
keys = append(keys, k)
}
sort.Strings(keys)
for _, k := range keys {
fmt.Printf("%s%s\n", padding+getPadding(root, getType(index, len(tree))), k)
tree[k].print(false, padding+getPadding(root, getTypeExternal(index, len(tree))))
index++
}
}
const (
regular Type = iota
last
afterLast
between
)
func (t Type) String() string {
switch t {
case regular:
return CyanString("├── ")
case last:
return CyanString("└── ")
case afterLast:
return CyanString(" ")
case between:
return CyanString("│ ")
default:
panic("Invalid type")
}
}
func getType(index, length int) Type {
if index+1 == length {
return last
} else if index+1 > length {
return afterLast
}
return regular
}
func getTypeExternal(index, length int) Type {
if index+1 == length {
return afterLast
}
return between
}
func getPadding(root bool, t Type) string {
if root {
return ""
}
return t.String()
}