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

Community realm. Read the code first. Community realm, deployed by its author. Read the code before you interact or send coins.

/p/nym-moultest123/x/daily/bidimap/v0

Directory · 4 Files
README.md Open

gno.land/p/nym-moultest123/x/daily/bidimap/v0

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

1import "gno.land/p/nym-moultest123/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/nym-moultest123/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.