tree.gno
2.06 Kb · 91 lines
1package avl
2
3type ITree interface {
4
5 Size() int
6 Has(key string) bool
7 Get(key string) any
8 GetByIndex(index int) (key string, value any)
9 Iterate(start, end string, cb IterCbFn) bool
10 ReverseIterate(start, end string, cb IterCbFn) bool
11 IterateByOffset(offset int, count int, cb IterCbFn) bool
12 ReverseIterateByOffset(offset int, count int, cb IterCbFn) bool
13
14 Set(key string, value any) (updated bool)
15 Remove(key string) (value any, removed bool)
16}
17
18type IterCbFn func(key string, value any) bool
19
20type Tree struct {
21 node *Node
22}
23
24func NewTree() *Tree {
25 return &Tree{
26 node: nil,
27 }
28}
29
30func (tree *Tree) Size() int {
31 return tree.node.Size()
32}
33
34func (tree *Tree) Has(key string) (has bool) {
35 return tree.node.Has(key)
36}
37
38func (tree *Tree) Get(key string) any {
39 _, value, _ := tree.node.Get(key)
40 return value
41}
42
43func (tree *Tree) GetByIndex(index int) (key string, value any) {
44 return tree.node.GetByIndex(index)
45}
46
47func (tree *Tree) Set(key string, value any) (updated bool) {
48 newnode, updated := tree.node.Set(key, value)
49 tree.node = newnode
50 return updated
51}
52
53func (tree *Tree) Remove(key string) (value any, removed bool) {
54 newnode, _, value, removed := tree.node.Remove(key)
55 tree.node = newnode
56 return value, removed
57}
58
59func (tree *Tree) Iterate(start, end string, cb IterCbFn) bool {
60 return tree.node.TraverseInRange(start, end, true, true,
61 func(node *Node) bool {
62 return cb(node.Key(), node.Value())
63 },
64 )
65}
66
67func (tree *Tree) ReverseIterate(start, end string, cb IterCbFn) bool {
68 return tree.node.TraverseInRange(start, end, false, true,
69 func(node *Node) bool {
70 return cb(node.Key(), node.Value())
71 },
72 )
73}
74
75func (tree *Tree) IterateByOffset(offset int, count int, cb IterCbFn) bool {
76 return tree.node.TraverseByOffset(offset, count, true, true,
77 func(node *Node) bool {
78 return cb(node.Key(), node.Value())
79 },
80 )
81}
82
83func (tree *Tree) ReverseIterateByOffset(offset int, count int, cb IterCbFn) bool {
84 return tree.node.TraverseByOffset(offset, count, false, true,
85 func(node *Node) bool {
86 return cb(node.Key(), node.Value())
87 },
88 )
89}
90
91var _ ITree = (*Tree)(nil)