# `gno.land/p/moul/memo/v0`
A simple memoization utility to cache function results, **backed by a B+ tree**
(`gno.land/p/nt/bptree`).
A B+ tree packs many entries per persisted node, so it costs materially less
storage and gas per cached entry than an AVL backing would.
```go
import "gno.land/p/moul/memo/v0"
m := memo.New()
// Cache expensive computation; subsequent calls with the same key
// return the cached result without re-running the function.
result := m.Memoize("key", func() any {
return "computed-value"
})
m.Invalidate("key") // drop one entry
m.Clear() // drop all entries
m.Size() // number of cached entries
```
> ⚠️ **Gno usage:** storage updates only persist during transactions. Memoizing
> during queries/render will not persist and only wastes resources — use this in
> transaction-driven contexts.
**Caveats from the B+ tree backing:** it mutates in place (a copy-on-write AVL
backing would not), so do not Invalidate/add entries from inside a callback
iterating the same Memoizer, and do not copy a non-zero `Memoizer` by value.
<!-- BEGIN GNOCONTRACTS FOOTER (generated by `make readmes`; do not edit below) -->
---
Part of **[moul/gno-contracts](https://github.com/moul/gno-contracts)** — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage.
**Dependency graph:**

> ⚠️ **Disclaimer:** provided as-is, without warranty; not security-audited. Full disclaimer: [DISCLAIMER](https://github.com/moul/gno-contracts/blob/main/DISCLAIMER.md).
<!-- END GNOCONTRACTS FOOTER -->
Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.