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

v0 source pure

Package soundex implements the Soundex phonetic algorithm as a pure, reusable package: names that sound alike in Engl...

Readme View source

gno.land/p/moul/x/daily/soundex/v0

Soundex phonetic algorithmEncode, 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 PfisterP236, not P123;
  • h and w are transparent: consonants either side are treated as adjacent, so AshcraftA261, not A226;
  • vowels are not transparent — they separate, so a repeated code after a vowel is emitted again: TymczakT522.

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.

Overview

Package soundex implements the Soundex phonetic algorithm as a pure, reusable package: names that sound alike in English encode to the same four-character key, so "Robert" and "Rupert" both give R163.

This is the 1918 Russell/Odell algorithm as used by the US census, with the rules that are usually got wrong implemented explicitly:

  • the first letter is kept as-is and its digit still suppresses a following consonant of the same code ("Pfister" → P236, not P123);
  • 'h' and 'w' are TRANSPARENT: consonants either side of them are treated as adjacent ("Ashcraft" → A261, not A226);
  • vowels are not transparent — they separate, so a repeated code after a vowel is emitted again ("Tymczak" → T522).

Soundex is English-centric and lossy by design: it is a *blocking* key for finding candidates, never a proof that two names match.

A live demo of this package is at r/moul/x/daily/soundexdemo(/r/moul/x/daily/soundexdemo/v0).

Functions 4

func Encode

1func Encode(s string) string
source

Encode returns the four-character Soundex key for s, or "" when s contains no ASCII letters. Non-letters are ignored, so "O'Brien" and "OBrien" agree.

func EncodeAll

1func EncodeAll(names []string) []string
source

EncodeAll returns the keys for each input, in order.

func Match

1func Match(a, b string) bool
source

Match reports whether two strings share a Soundex key. Empty keys never match, so two inputs with no letters are not "the same name".

func Normalize

1func Normalize(s string) string
source

Normalize upper-cases and strips non-letters — the input Encode actually sees. Exposed so callers can show their work.

Imports 1

  • strings stdlib

Source Files 3