///|
/// Return true when input is a canonical uppercase or lowercase Roman numeral.
pub fn is_canonical(input : String) -> Bool {
  match parse(input) {
    Ok(_) => true
    Err(_) => false
  }
}

///|
/// Normalize valid uppercase or lowercase input to canonical uppercase text.
pub fn canonicalize(input : String) -> Result[String, ParseError] {
  match parse(input) {
    Err(error) => Err(error)
    Ok(value) =>
      match format(value) {
        Ok(text) => Ok(text)
        Err(_) => Err(ParseOutOfRange(value))
      }
  }
}