Search Apps Documentation Source Content File Folder Download Copy Actions Download State String Boolean Number Struct Map Slice Pointer Function Closure Reference Nil Package Type Interface Unknown

README.md

2.13 Kb · 47 lines

gno.land/p/moul/x/daily/bidimap/v0

Bidirectional map, unique both waysNew, Put, PutUnique, Get, GetKey, Has, HasValue, Delete, DeleteValue, Keys, Values, Iterate, Invert, Clone, Consistent, MaxPairs.

1import "gno.land/p/moul/x/daily/bidimap/v0"
2
3m := bidimap.New()
4m.Put("alice", "admin")
5m.Get("alice")      // "admin", true
6m.GetKey("admin")   // "alice", true — O(1), not a scan

Both sides are unique, which is the interesting constraint: inserting a pair whose value already belongs to another key must do something deliberate rather than silently corrupt the reverse index.

  • Put replaces, and returns the pairs it displaced, so the caller sees what it evicted rather than discovering it later.
  • PutUnique refuses instead, returning false and changing nothing.

What is not on offer is a half-updated map. Consistent() is exported so callers and tests can assert the two indexes agree; it is true through the whole public API.

One subtlety with MaxPairs (4096): a full map still accepts a Put that rebinds an existing key or steals an existing value, because that reuses a slot rather than growing the map. Only a pair new on both sides is refused.

Keys/Values come back sorted, never in map order: gno map iteration order is unspecified, and a Render built from one can differ between nodes.

Live demo: r/moul/x/daily/bidimapdemo · render it at /r/moul/x/daily/bidimapdemo/v0.


Part of moul/gno-contracts — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage.

🧪 Highly experimental — potentially vibe-coded. Not audited; may break, change, or be removed at any time. Do not use with anything of value. Full disclaimer: DISCLAIMER.