///| Try parsers in order, returning the first success
pub fn[I, O] alt(parsers : Array[Parser[I, O]]) -> Parser[I, O] {
  fn(input) {
    let mut last_err : Err[ParseError[I]]? = None
    let mut last_incomplete : Needed? = None
    for parser in parsers {
      match parser(input) {
        Ok(result) => return Ok(result)
        Err(Err::Failure(err)) => return Err(Err::Failure(err))
        Err(Err::Error(err)) => last_err = Some(Err::Error(err))
        Err(Err::Incomplete(needed)) => last_incomplete = Some(needed)
      }
    }
    match last_incomplete {
      Some(needed) => Err(Err::Incomplete(needed))
      None =>
        match last_err {
          Some(err) => Err(err)
          None => Err(Err::Error(ParseError::new(input, ErrorKind::Alt)))
        }
    }
  }
}

///| Try two parsers in order, returning the first success
pub fn[I, O] alt2(first : Parser[I, O], second : Parser[I, O]) -> Parser[I, O] {
  fn(input) {
    match first(input) {
      Ok(result) => Ok(result)
      Err(Err::Failure(err)) => Err(Err::Failure(err))
      Err(Err::Error(err)) =>
        match second(input) {
          Ok(result) => Ok(result)
          Err(Err::Failure(err2)) => Err(Err::Failure(err2))
          Err(Err::Incomplete(needed)) => Err(Err::Incomplete(needed))
          Err(Err::Error(_)) => Err(Err::Error(err))
        }
      Err(Err::Incomplete(needed)) =>
        match second(input) {
          Ok(result) => Ok(result)
          Err(Err::Failure(err2)) => Err(Err::Failure(err2))
          Err(Err::Incomplete(needed2)) => Err(Err::Incomplete(needed2))
          Err(Err::Error(_)) => Err(Err::Incomplete(needed))
        }
    }
  }
}