18 lines
500 B
Rust
18 lines
500 B
Rust
use crate::parser::{Parser, ParserInput, Representation};
|
|
|
|
pub fn optional<P, I, O, E>(parser: P) -> impl Parser<I, Option<O>, E>
|
|
where
|
|
P: Parser<I, O, E>,
|
|
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)
|
|
}
|