README.md
gno.land/p/moul/x/daily/bitset/v0
Dense fixed-capacity bit vector — New, FromSlice, Set, Clear, Flip,
Has, Count, Slice, Clone, Union, Intersect, Difference,
SymmetricDifference, Equal, MaxBits.
A compact set of small non-negative integers. Storage is []uint64 of
ceil(n/64) words, so 1024 bits cost 16 words instead of 1024 booleans — the
reason to reach for this on chain, where every byte is paid for.
1import "gno.land/p/moul/x/daily/bitset/v0"
2
3b := bitset.FromSlice(20, []int{1, 2, 3})
4c := bitset.FromSlice(20, []int{3, 4})
5bitset.Union(b, c).Slice() // [1 2 3 4]
6bitset.Intersect(b, c).Slice() // [3]
7b.Count() // 3
Capacity is fixed at construction: operations are bounds-checked and return
false out of range rather than growing, because silent growth would make gas
unpredictable. Has on an out-of-range index is simply false — something that
cannot be a member is not a member.
Combining two sets of different capacities returns nil rather than padding
one silently; a size mismatch is a caller error worth surfacing.
MaxBits (65536) caps allocation. Note String() prints bit 0 first, so it
reads in index order — the reverse of binary notation.
Live demo: r/moul/x/daily/bitsetdemo
· render it at /r/moul/x/daily/bitsetdemo/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.