func NewNode
NewNode creates a new node with the given key and value.
Package cow provides a Copy-on-Write (CoW) AVL tree implementation. This is a fork of gno.land/p/nt/avl that adds CoW...
gno.land/p/moul/cow/v1TODO: describe this package.
Part of moul/gno-contracts — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage.
⚠️ Disclaimer: provided as-is, without warranty; not security-audited. Full disclaimer: DISCLAIMER.
Package cow provides a Copy-on-Write (CoW) AVL tree implementation. This is a fork of gno.land/p/nt/avl that adds CoW functionality while maintaining the original AVL tree interface and properties.
Copy-on-Write creates a copy of a data structure only when it is modified, while still presenting the appearance of a full copy. When a tree is cloned, it initially shares all its nodes with the original tree. Only when a modification is made to either the original or the clone are new nodes created, and only along the path from the root to the modified node.
Key features:
While the CoW mechanism handles structural copying automatically, users need to consider how to handle the values stored in the tree:
Simple Values (int, string, etc.): - These are copied by value automatically - No additional handling needed
Complex Values (structs, pointers): - Only the reference is copied by default - Users must implement their own deep copy mechanism if needed
Example:
1// Create original tree
2original := cow.NewTree()
3original.Set("key1", "value1")
4
5// Create a clone - O(1) operation
6clone := original.Clone()
7
8// Modify clone - only affected nodes are copied
9clone.Set("key1", "modified")
10
11// Original remains unchanged
12val, _ := original.Get("key1") // Returns "value1"
1type Node struct {
2 key string // key is the unique identifier for the node.
3 value any // value is the data stored in the node.
4 height int8 // height is the height of the node in the tree.
5 size int // size is the number of nodes in the subtree rooted at this node.
6 leftNode *Node // leftNode is the left child of the node.
7 rightNode *Node // rightNode is the right child of the node.
8}Node represents a node in an AVL tree.
Equal compares two nodes for structural equality. WARNING: This is an expensive operation that recursively traverses the entire tree structure. It should only be used in tests or when absolutely necessary.
Get searches for a node with the given key in the subtree rooted at the node and returns its index, value, and whether it exists.
GetByIndex retrieves the key-value pair of the node at the given index in the subtree rooted at the node.
Has checks if a node with the given key exists in the subtree rooted at the node.
IsLeaf checks if the node is a leaf node (has no children).
Shortcut for TraverseInRange.
Key returns the key of the node.
Remove deletes the node with the given key from the subtree rooted at the node. returns the new root of the subtree, the new leftmost leaf key (if changed), the removed value and the removal was successful.
Shortcut for TraverseInRange.
Set inserts a new node with the given key-value pair into the subtree rooted at the node, and returns the new root of the subtree and whether an existing node was updated.
XXX consider a better way to do this... perhaps split Node from Node.
Size returns the size of the subtree rooted at the node.
1func (node *Node) TraverseByOffset(offset, limit int, descending bool, leavesOnly bool, cb func(*Node) bool) boolTraverseByOffset traverses all nodes, including inner nodes. A limit of math.MaxInt means no limit.
1func (node *Node) TraverseInRange(start, end string, ascending bool, leavesOnly bool, cb func(*Node) bool) boolTraverseInRange traverses all nodes, including inner nodes. Start is inclusive and end is exclusive when ascending, Start and end are inclusive when descending. Empty start and empty end denote no start and no end. If leavesOnly is true, only visit leaf nodes. NOTE: To simulate an exclusive reverse traversal, just append 0x00 to start.
Value returns the value of the node.
The zero struct can be used as an empty tree.
Clone creates a shallow copy of the tree
Equal returns true if the two trees contain the same key-value pairs. WARNING: This is an expensive operation that recursively traverses the entire tree structure. It should only be used in tests or when absolutely necessary.
Get retrieves the value associated with the given key. It returns the value and a boolean indicating whether the key exists.
GetByIndex retrieves the key-value pair at the specified index in the tree. It returns the key and value at the given index.
Has checks whether a key exists in the tree. It returns true if the key exists, otherwise false.
Iterate performs an in-order traversal of the tree within the specified key range. It calls the provided callback function for each key-value pair encountered. If the callback returns true, the iteration is stopped.
IterateByOffset performs an in-order traversal of the tree starting from the specified offset. It calls the provided callback function for each key-value pair encountered, up to the specified count. If the callback returns true, the iteration is stopped.
Remove removes a key-value pair from the tree. It returns the removed value and a boolean indicating whether the key was found and removed.
ReverseIterate performs a reverse in-order traversal of the tree within the specified key range. It calls the provided callback function for each key-value pair encountered. If the callback returns true, the iteration is stopped.
ReverseIterateByOffset performs a reverse in-order traversal of the tree starting from the specified offset. It calls the provided callback function for each key-value pair encountered, up to the specified count. If the callback returns true, the iteration is stopped.
Set inserts a key-value pair into the tree. If the key already exists, the value will be updated. It returns a boolean indicating whether the key was newly inserted or updated.
Size returns the number of key-value pair in the tree.