///|
fn soundex_code(letter : UInt16) -> Int {
  match letter {
    66 | 70 | 80 | 86 => 1
    67 | 71 | 74 | 75 | 81 | 83 | 88 | 90 => 2
    68 | 84 => 3
    76 => 4
    77 | 78 => 5
    82 => 6
    _ => 0
  }
}

///|
/// Encodes ASCII letters with the four-character American Soundex scheme.
pub fn soundex(input : String) -> String {
  let letters = normalize_ascii_letters(input)
  if letters.length() == 0 {
    return ""
  }
  let first = letters[0]
  let mut result = first.unsafe_to_char().to_string()
  let mut previous = soundex_code(first)
  let mut digits = 0
  for i = 1; i < letters.length() && digits < 3; i = i + 1 {
    let letter = letters[i]
    if letter == 72 || letter == 87 {
      continue
    }
    let code = soundex_code(letter)
    if code != 0 && code != previous {
      result = result + code.to_string()
      digits = digits + 1
    }
    previous = code
  }
  while digits < 3 {
    result = result + "0"
    digits = digits + 1
  }
  result
}