Order-statistic B-tree with O(log n) position-indexed operations
Dependencies
moon add dowdiness/order-tree// Build from array
let tree = @order_tree.OrderTree::from_array(["a", "b", "c", "d"])
// Positional access
tree[0] //=> Some("a")
tree[2] //=> Some("c")
// Range view
tree[1:3] //=> ["b", "c"]
// Insert and delete
tree.insert_at(2, "x") // ["a", "b", "x", "c", "d"]
tree.delete_at(0) //=> Some("a"), tree is ["b", "x", "c", "d"]
// Range delete
tree.delete_range(1, 3) // ["b", "d"]| Method | Description | Complexity |
|---|---|---|
| OrderTree::new(min_degree?) | Create empty tree | O(1) |
| OrderTree::from_array(items, min_degree?) | Bulk build from array | O(n) |
| get_at(pos) / tree[pos] | Element at position | O(log n) |
| find(pos) | Element + offset within element | O(log n) |
| insert_at(pos, elem) | Insert element at position; non-positive spans are ignored | O((m + 1) log n)¹ |
| delete_at(pos) | Delete element at position | O((m + 1) log n)¹ |
| delete_range(start, end) | Delete span range [start, end) | O(log n) |
| set_at(pos, elem) / tree[pos] = elem | Replace element; non-positive spans are rejected without mutation | O((m + 1) log n)¹ |
| view(start?, end?) / tree[start:end] | Slice elements in range | O(k + log n) |
| iter() | Lazy iterator over all elements | O(n) total |
| span() | Total span | O(1) |
| size() | Number of RLE runs (≤ logical length when adjacent items merge) | O(1) |
| Need | Use |
|---|---|
| Insert/delete by position | OrderTree — insert_at, delete_at |
| Bulk construction from array | OrderTree — from_array (O(n) bottom-up) |
| Operator syntax (tree[i], tree[i:j]) | OrderTree — has #alias overloads |
| Custom splice logic (split/merge neighbors) | BTree — mutate_for_insert/delete callbacks |
| Embedding in another data structure | BTree — OrderTree is a thin wrapper |
moon add dowdiness/order-tree
moon add dowdiness/rle
moon add dowdiness/btree// Each E occupies span 1 and never merges with its neighbour.
pub struct E {
v : Int
} derive(Eq)
pub impl @rle.HasLength for E with length(_self) { 1 }
pub impl @rle.Spanning for E with span(_self) { 1 }
pub impl @rle.Mergeable for E with can_merge(_a, _b) { false }
pub impl @rle.Mergeable for E with merge(a, _b) { a }
pub impl @rle.Sliceable for E with slice(self, start~, end~) {
let _ = start
let _ = end
Ok(self)
}
// BTreeElem is an empty super-trait. MoonBit emits warning [0027]
// for implicit empty-trait impls, so add an explicit one:
pub impl @btree.BTreeElem for Edowdiness/rle Element traits (Spanning, Mergeable, Sliceable)
↑
dowdiness/btree Counted B+ tree engine
↑ - Navigation by span position (not keys)
| - All data in leaves, internal nodes are navigational
| - Automatic RLE merge of adjacent leaves
|
dowdiness/order-tree High-level sequence API (this library)
- insert_at, delete_at, from_array
- Operator overloads
- Used by the CRDT layer (event-graph-walker)Order-statistic B-tree with O(log n) position-indexed operations
Dependencies