PathrockNetwork Gno Explorer
HomeBlocksTransactionsTokensRealmsPackagesValidatorsAnalytics

PathrockNetwork Gno Explorer — an independent explorer for Gno.land Mainnet (gnoland-1), operated by PathrockNetwork. Not an official Gno.land service.

gnowebarchive RPC

gno.land/p/nt/bptree/v0

Package
Open in gnoweb ↗

Overview

Kind
Pure package
Name
v0
Namespace
nt / bptree
Files
8 (README)(gnomod.toml)
Exported functions
n/a — not supported for pure packages by the node (vm/qfuncs)
Module
gno.land/p/nt/bptree/v0
gno
0.9

Files (8)

  • README.mdmarkdown
  • gnomod.tomltoml
  • doc.gnogno
  • node.gnogno
  • tree.gnogno
  • example_test.gnogno
  • tree_test.gnogno
  • PLAN.mdmarkdown
  • README.mdPreviewRaw
    > **v0 - Unaudited**
    > This is an initial version of this package that has not yet been formally audited.
    > A fully audited version will be published as a subsequent release.
    > Use in production at your own risk.
    
    # `bptree` - Mutable B+ tree
    
    A mutable, in-place B+ tree for storing key-value data in Gno realms. Exposes the same `ITree` interface as `gno.land/p/nt/avl/v0` but uses a B+ tree internally — fewer pointer dereferences per operation and better cache locality, with a configurable fanout.
    
    ## Usage
    
    ```go
    package myrealm
    
    import "gno.land/p/nt/bptree/v0"
    
    // Zero value is usable (fanout 32). Persisted across transactions.
    var tree bptree.BPTree
    
    func Set(key string, value int) {
        tree.Set(key, value)
    }
    
    func Get(key string) int {
        raw := tree.Get(key)
        if raw == nil {
            panic("not found")
        }
        return raw.(int)
    }
    
    func RangeAsc(start, end string) {
        tree.Iterate(start, end, func(key string, value any) bool {
            // return true to stop early
            return false
        })
    }
    ```
    
    For a different fanout, use a constructor:
    
    ```go
    tree := bptree.NewBPTreeN(64) // fanout 64
    ```
    
    ## API
    
    ```go
    type BPTree struct{ /* unexported */ }
    
    func NewBPTree32() *BPTree            // fanout 32
    func NewBPTreeN(fanout int) *BPTree   // panics if fanout < 4
    
    // Read
    func (t *BPTree) Size() int
    func (t *BPTree) Has(key string) bool
    func (t *BPTree) Get(key string) (value any) // nil if the key is absent
    func (t *BPTree) GetByIndex(index int) (key string, value any)
    func (t *BPTree) Iterate(start, end string, cb IterCbFn) bool
    func (t *BPTree) ReverseIterate(start, end string, cb IterCbFn) bool
    func (t *BPTree) IterateByOffset(offset, count int, cb IterCbFn) bool
    func (t *BPTree) ReverseIterateByOffset(offset, count int, cb IterCbFn) bool
    
    // Write
    func (t *BPTree) Set(key string, value any) (updated bool)
    func (t *BPTree) Remove(key string) (value any, removed bool)
    
    type IterCbFn func(key string, value any) bool
    
    type ITree interface { /* same shape as BPTree's methods */ }
    ```
    
    The zero value of `BPTree` is a usable empty tree (fanout 32). `Iterate` uses `[start, end)` (start inclusive, end exclusive); `ReverseIterate` uses `[start, end]` (both inclusive). Empty strings mean unbounded. Callbacks return `true` to stop early. `GetByIndex` panics on out-of-range indices.
    
    The tree must not be modified during iteration (no `Set` or `Remove` from the callback).
    
    ## Subpackages
    
    - `gno.land/p/nt/bptree/list/v0` - ordered list built on top of `BPTree`.
    - `gno.land/p/nt/bptree/pager/v0` - pagination helper for trees and lists.
    - `gno.land/p/nt/bptree/rotree/v0` - read-only view of a `BPTree`.
    
    ## Notes
    
    - API and semantics match `gno.land/p/nt/avl/v0` exactly — `""` is a valid key, `Get` returns `nil` for a missing key (use `Has` to distinguish a stored `nil`), and `Remove` returns `(nil, false)`.
    - Never return the live `*BPTree` from a realm getter: a caller can then call `Set`/`Remove` on it under your realm's authority. Return values, copies, or a read-only `rotree` view.
    - Sequential keys from `seqid` (`gno.land/p/nt/seqid/v0`) pair well here: monotonic inserts hit the append-optimized split path.
    - Fanout must be `>= 4`. Higher fanouts mean shallower trees and fewer object loads per lookup, at the cost of larger individual node objects.
    - Each node (leaf or inner) is persisted as a separate object, so reads only load the `O(log n)` nodes on the search path — same storage-efficiency benefit as `avl`.
    - No sibling pointers or `first`/`last` shortcuts: iteration uses an ephemeral stack to keep every persisted node at ref-count 1 (avoids Gno's object-escape penalty).
    

    Functions

    not supported for pure packages by the node (vm/qfuncs)

    Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.