Generic counted B-tree with O(log n) indexed access, insert, delete, and range operations
moon add dowdiness/btreeInternal(counts=[5, 3, 4], total=12)
├── Leaf(elem=a, span=5) positions [0, 5)
├── Leaf(elem=b, span=3) positions [5, 8)
└── Leaf(elem=c, span=4) positions [8, 12)// Define your element type
struct TextRun {
text : String
len : Int
}
// Implement BTreeElem traits (Spanning, Mergeable, Sliceable)
impl @rle.Spanning for TextRun with span(self) { self.len }
impl @rle.Mergeable for TextRun with can_merge(a, b) { true }
impl @rle.Mergeable for TextRun with merge(a, b) {
{ text: a.text + b.text, len: a.len + b.len }
}
// ... plus Sliceable, HasLength
impl @btree.BTreeElem for TextRun
// Use the tree
let tree : @btree.BTree[TextRun] = @btree.BTree::new()
tree.init_root({ text: "hello", len: 5 }, 5)| Method | Description | Complexity |
|---|---|---|
| BTree::new(min_degree?) | Create empty tree (default min_degree=10) | O(1) |
| get_at(pos) | Element at span position | O(log n) |
| find(pos) | Element + offset within element | O(log n) |
| mutate_for_insert(pos, callback) | Insert via leaf splice callback | O(log n) |
| mutate_for_delete(pos, callback) | Delete via leaf splice callback | O(log n) |
| delete_range(start, end) | Delete span range [start, end) | O(log n)* |
| view(start?, end?) | Slice elements in range | O(k + log n) |
| iter() | Lazy cursor-based iterator | O(n) total |
| each(f) | Visit all elements | O(n) |
| to_array() | Collect all elements | O(n) |
| span() | Total span (cached) | O(1) |
| size() | Number of leaves | O(1) |
dowdiness/rle Traits: Spanning, Mergeable, Sliceable
↑
dowdiness/btree Counted B+ tree (this library)
↑
dowdiness/order-tree High-level API: insert_at, delete_at, from_arrayfn[T, R] BTree::mutate_for_delete(self : BTree[T], pos : Int, f : (LeafContext[T]) -> (Splice[T], R)) -> R?fn[T] BTree::mutate_for_insert(self : BTree[T], pos : Int, f : (LeafContext[T]) -> Splice[T]) -> Unitimpl Show for FindResult[T]Install
Download zipGeneric counted B-tree with O(log n) indexed access, insert, delete, and range operations