///|
pub fn jaro(a : String, b : String) -> Double {
  let a_chars = a.to_array()
  let b_chars = b.to_array()
  let a_len = a_chars.length()
  let b_len = b_chars.length()
  if a_len == 0 && b_len == 0 {
    return 1.0
  }
  if a_len == 0 || b_len == 0 {
    return 0.0
  }
  let max_len = if a_len > b_len { a_len } else { b_len }
  let search_range = if max_len / 2 > 0 { max_len / 2 - 1 } else { 0 }
  let a_matched = Array::make(a_len, false)
  let b_matched = Array::make(b_len, false)
  let mut matches = 0.0
  for i in 0.. search_range { i - search_range } else { 0 }
    let hi = @cmp.minimum(i + search_range + 1, b_len)
    for j = lo; j < hi; j = j + 1 {
      if not(b_matched[j]) && a_chars[i] == b_chars[j] {
        a_matched[i] = true
        b_matched[j] = true
        matches += 1.0
        break
      }
    }
  }
  if matches == 0.0 {
    return 0.0
  }
  let mut transpositions = 0.0
  let mut k = 0
  for i in 0.. Double {
  let weight = @cmp.maximum(0.0, @cmp.minimum(prefix_weight, 0.25))
  let jaro_score = jaro(a, b)
  if jaro_score <= 0.7 {
    return jaro_score
  }
  let a_chars = a.to_array()
  let b_chars = b.to_array()
  let prefix_len = @cmp.minimum(
    4,
    @cmp.minimum(a_chars.length(), b_chars.length()),
  )
  let mut common_prefix = 0.0
  for i in 0..