///|
fn modulo(value : Int, divisor : Int) -> Int {
  let result = value % divisor
  if result < 0 {
    result + divisor
  } else {
    result
  }
}

///|
pub fn plural_category(locale : String, value : Int) -> String {
  let n = if value < 0 { -value } else { value }
  let language = locale_language_lossy(locale)
  if language == "zh" || language == "ja" {
    "other"
  } else if language == "ru" {
    let ten = modulo(n, 10)
    let hundred = modulo(n, 100)
    if ten == 1 && hundred != 11 {
      "one"
    } else if (ten >= 2 && ten <= 4) && !(hundred >= 12 && hundred <= 14) {
      "few"
    } else if ten == 0 ||
      (ten >= 5 && ten <= 9) ||
      (hundred >= 11 && hundred <= 14) {
      "many"
    } else {
      "other"
    }
  } else if language == "ar" {
    let hundred = modulo(n, 100)
    if n == 0 {
      "zero"
    } else if n == 1 {
      "one"
    } else if n == 2 {
      "two"
    } else if hundred >= 3 && hundred <= 10 {
      "few"
    } else if hundred >= 11 && hundred <= 99 {
      "many"
    } else {
      "other"
    }
  } else if n == 1 {
    "one"
  } else {
    "other"
  }
}

///|
pub fn ordinal_category(locale : String, value : Int) -> String {
  if locale_language_lossy(locale) != "en" {
    "other"
  } else {
    let ten = modulo(value, 10)
    let hundred = modulo(value, 100)
    if ten == 1 && hundred != 11 {
      "one"
    } else if ten == 2 && hundred != 12 {
      "two"
    } else if ten == 3 && hundred != 13 {
      "few"
    } else {
      "other"
    }
  }
}