///|
fn refined_soundex_code(letter : UInt16) -> Int {
  match letter {
    65 | 69 | 72 | 73 | 79 | 85 | 87 | 89 => 0
    66 | 80 => 1
    70 | 86 => 2
    67 | 75 | 83 => 3
    71 | 74 => 4
    81 | 88 | 90 => 5
    68 | 84 => 6
    76 => 7
    77 | 78 => 8
    82 => 9
    _ => 0
  }
}

///|
/// Encodes ASCII letters with the US English Refined Soundex mapping.
pub fn refined_soundex(input : String) -> String {
  let letters = normalize_ascii_letters(input)
  if letters.length() == 0 {
    return ""
  }
  let mut result = letters[0].unsafe_to_char().to_string()
  let mut previous = -1
  for i = 0; i < letters.length(); i = i + 1 {
    let code = refined_soundex_code(letters[i])
    if code != previous {
      result = result + code.to_string()
      previous = code
    }
  }
  result
}