// build // Copyright 2025 The Go Authors. All rights reserved. // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. package main import ( "iter" ) type leafSet map[rune]struct{} type branchMap map[rune]*node func (bm branchMap) findOrCreateBranch(r rune) *node { if _, ok := bm[r]; !ok { bm[r] = newNode() } return bm[r] } func (bm branchMap) allSuffixes() iter.Seq[string] { return func(yield func(string) bool) { for r, n := range bm { for s := range n.allStrings() { if !yield(string(r) + s) { return } } } } } type node struct { leafSet branchMap } func newNode() *node { return &node{make(leafSet), make(branchMap)} } func (n *node) add(s []rune) { switch len(s) { case 0: return case 1: n.leafSet[s[0]] = struct{}{} default: n.branchMap.findOrCreateBranch(s[0]).add(s[1:]) } } func (n *node) addString(s string) { n.add([]rune(s)) } func (n *node) allStrings() iter.Seq[string] { return func(yield func(string) bool) { for s := range n.leafSet { if !yield(string(s)) { return } } for r, n := range n.branchMap { for s := range n.allSuffixes() { if !yield(string(r) + s) { return } } } } } func main() { root := newNode() for _, s := range []string{"foo", "bar", "baz", "a", "b", "c", "hello", "world"} { root.addString(s) } for s := range root.allStrings() { println(s) } }