Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

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)