///|
/// Check the core JCS invariant that canonicalizing an already canonical value
/// is idempotent.
pub fn canonical_idempotent(value : JsonValue) -> Result[Bool, CanonicalError] {
  let first = match canonicalize(value) {
    Ok(value) => value
    Err(error) => return Err(error)
  }
  let reparsed = match parse(first) {
    Ok(value) => value
    Err(error) => return Err(InvalidNumber(first, error.message()))
  }
  let second = match canonicalize(reparsed) {
    Ok(value) => value
    Err(error) => return Err(error)
  }
  Ok(first == second)
}

///|
pub fn canonical_idempotent_document(input : String) -> Result[Bool, String] {
  let value = match parse(input) {
    Ok(value) => value
    Err(error) => return Err(error.message())
  }
  match canonical_idempotent(value) {
    Ok(result) => Ok(result)
    Err(error) => Err(error.message())
  }
}