README.md
gno.land/p/moul/x/daily/soundex/v0
Soundex phonetic algorithm — Encode, Match, EncodeAll, Normalize.
Names that sound alike in English encode to the same four-character key:
Robert and Rupert both give R163.
1import "gno.land/p/moul/x/daily/soundex/v0"
2
3soundex.Encode("Robert") // "R163"
4soundex.Encode("Ashcraft") // "A261"
5soundex.Match("Robert", "Rupert") // true
The 1918 Russell/Odell algorithm as used by the US census, with the three rules that are usually got wrong implemented explicitly — each has a test:
- the first letter keeps its own code and still suppresses a following
consonant of the same code, so
Pfister→P236, notP123; handware transparent: consonants either side are treated as adjacent, soAshcraft→A261, notA226;- vowels are not transparent — they separate, so a repeated code after a
vowel is emitted again:
Tymczak→T522.
Non-letters are ignored, so O'Brien and OBrien agree. Input with no ASCII
letters has no key (""), and Match never reports two such inputs as
matching — "no name" is not a name they share.
Soundex is English-centric and lossy by design: it is a blocking key for finding candidates cheaply, never proof that two names are the same.
Live demo: r/moul/x/daily/soundexdemo
· render it at /r/moul/x/daily/soundexdemo/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.