1// Package bitsetdemo is a small gnoweb demo of the dense bit vector provided by2// the [p/moul/x/daily/bitset](/p/moul/x/daily/bitset/v0) library: it sieves the3// primes under 100 into a bit set and shows the set algebra on two small sets.4//5// It contains no bit-twiddling of its own — storage, popcount and the set6// operations all come from the library. Stateless, so Render is deterministic.7package bitsetdemo89import (10 "strconv"11 "strings"1213 "gno.land/p/moul/x/daily/bitset/v0"14)1516// limit bounds the sieve shown on the page.17const limit = 1001819// primes returns a bit set of the primes below limit, sieved with the bit set20// itself as the composite marker.21func primes() *bitset.BitSet {22 composite := bitset.New(limit)23 out := bitset.New(limit)24 for p := 2; p < limit; p++ {25 if composite.Has(p) {26 continue27 }28 out.Set(p)29 for m := p * p; m < limit; m += p {30 composite.Set(m)31 }32 }33 return out34}3536// Render renders the demo for gnoweb.37func Render(path string) string {38 var b strings.Builder39 b.WriteString("# BitSet\n\n")40 b.WriteString("A dense bit vector, demoing the ")41 b.WriteString("[`p/moul/x/daily/bitset`](/p/moul/x/daily/bitset/v0) library.\n\n")4243 p := primes()44 b.WriteString("## Primes under ")45 b.WriteString(strconv.Itoa(limit))46 b.WriteString("\n\n**")47 b.WriteString(strconv.Itoa(p.Count()))48 b.WriteString("** set bits in ")49 b.WriteString(strconv.Itoa(p.Cap()))50 b.WriteString(" bits of capacity:\n\n")51 b.WriteString(list(p.Slice()))5253 small := bitset.FromSlice(16, []int{1, 2, 3, 5, 8})54 even := bitset.FromSlice(16, []int{2, 4, 6, 8, 10})55 b.WriteString("\n## Set algebra\n\n")56 b.WriteString("| set | bits |\n|---|---|\n")57 row(&b, "a", small)58 row(&b, "b", even)59 row(&b, "a ∪ b", bitset.Union(small, even))60 row(&b, "a ∩ b", bitset.Intersect(small, even))61 row(&b, "a \\ b", bitset.Difference(small, even))62 row(&b, "a △ b", bitset.SymmetricDifference(small, even))63 return b.String()64}6566func row(b *strings.Builder, name string, s *bitset.BitSet) {67 b.WriteString("| ")68 b.WriteString(name)69 b.WriteString(" | `")70 b.WriteString(list1(s.Slice()))71 b.WriteString("` |\n")72}7374func list(xs []int) string {75 if len(xs) == 0 {76 return "_none_\n"77 }78 return "`" + list1(xs) + "`\n"79}8081func list1(xs []int) string {82 parts := []string{}83 for _, x := range xs {84 parts = append(parts, strconv.Itoa(x))85 }86 return strings.Join(parts, " ")87}88Render(path string) string
Signatures reconstructed verbatim from vm/qfuncs — interface params keep their inline definitions.
vm/qrender output, sanitized (docs/render-security.md) and displayed in an empty-sandbox iframe — scripts, forms and popups cannot run. Links stay inert in-preview; right-click to open.