///|
pub(all) suberror StrsimError {
  UnequalLength
}

///|
pub impl Show for StrsimError with output(self, logger) {
  match self {
    UnequalLength => logger.write_string("UnequalLength")
  }
}

///|
pub(all) enum DistanceMetric {
  Hamming
  Levenshtein
  Osa
  DamerauLevenshtein
}

///|
pub(all) enum SimilarityMetric {
  NormalizedLevenshtein
  Jaro
  JaroWinkler
  SorensenDice
}

///|
pub fn distance(
  metric : DistanceMetric,
  a : String,
  b : String,
) -> Int raise StrsimError {
  match metric {
    Hamming => hamming(a, b)
    Levenshtein => levenshtein(a, b)
    Osa => osa_distance(a, b)
    DamerauLevenshtein => damerau_levenshtein(a, b)
  }
}

///|
pub fn similarity(metric : SimilarityMetric, a : String, b : String) -> Double {
  match metric {
    NormalizedLevenshtein => normalized_levenshtein(a, b)
    Jaro => jaro(a, b)
    JaroWinkler => jaro_winkler(a, b)
    SorensenDice => sorensen_dice(a, b)
  }
}