///|
/// The outcome of validating a JSON document with type-erased checks.
///
/// `Valid` carries no decoded value. Use the original typed lenses to read the
/// document after validation succeeds.
pub enum Validation {
  Valid
  Invalid(ReadOnlyArray[Issue])
} derive(Eq, Debug)

///|
/// Runs every lens check and returns all issues in input order.
///
/// This function never constructs or returns application values.
pub fn validate(document : Json, lenses : Array[&LensTrait]) -> Validation {
  let issues : Array[Issue] = []
  for lens in lenses {
    LensTrait::check(lens, document) catch {
      LensError(issue) => issues.push(issue)
    }
  }
  if issues.is_empty() {
    Valid
  } else {
    Invalid(ReadOnlyArray::from_array(issues))
  }
}