// Unicode 15.0.0 decimal digit starts, derived from CPython unicodedata.

///|
let format_decimal_starts : Array[Int32] = [
  48, 1632, 1776, 1984, 2406, 2534, 2662, 2790, 2918, 3046, 3174, 3302, 3430, 3558,
  3664, 3792, 3872, 4160, 4240, 6112, 6160, 6470, 6608, 6784, 6800, 6992, 7088, 7232,
  7248, 42528, 43216, 43264, 43472, 43504, 43600, 44016, 65296, 66720, 68912, 69734,
  69872, 69942, 70096, 70384, 70736, 70864, 71248, 71360, 71472, 71904, 72016, 72784,
  73040, 73120, 73552, 92768, 92864, 93008, 120782, 120792, 120802, 120812, 120822,
  123200, 123632, 124144, 125264, 130032,
]

///|
fn format_decimal_digit(char : Char) -> Int32? {
  let point = char.to_int()
  if point >= 48 && point <= 57 {
    return Some(point - 48)
  }
  if point < 1632 {
    return None
  }
  for start in format_decimal_starts {
    if point >= start && point < start + 10 {
      return Some(point - start)
    }
  }
  None
}

///|
fn format_decimal_text(raw : String, maximum : Int32) -> Int32? {
  let mut value = 0
  if raw == "" {
    return None
  }
  for char in raw.to_array() {
    let digit = match format_decimal_digit(char) {
      Some(digit) => digit
      None => return None
    }
    if value > (maximum - digit) / 10 {
      return None
    }
    value = value * 10 + digit
  }
  Some(value)
}