use crate::parser::{Parser, ParserInput, Representation}; pub fn optional(parser: P) -> impl Parser, E> where P: Parser, I: ParserInput + Clone, { let rep = Representation::from_choice( &mut [parser.representation(), Representation::new("ε")].into_iter(), ); let p = move |input: I| match parser.parse(input.clone()) { Ok((output, rest)) => Ok((Some(output), rest)), Err(_e) => Ok((None, input)), }; (p, rep) }