summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs30
1 files changed, 30 insertions, 0 deletions
diff --git a/src/lib.rs b/src/lib.rs
index e0be671..2878185 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -770,6 +770,36 @@ where
Not { parser }
}
+struct Opt<P> {
+ parser: P,
+}
+
+impl<I, P> Parser<I> for Opt<P>
+where
+ I: Input,
+ P: Parser<I>,
+{
+ type Output = Option<P::Output>;
+
+ fn run<OM: Mode, EM: Mode, Tracer: Trace<I>>(
+ &mut self,
+ it: InputIter<I>,
+ ) -> ParserResult<I, Self::Output, OM, EM> {
+ match self.parser.run::<OM, EM, Tracer>(it.clone()) {
+ Ok((rest, output)) => Ok((rest, OM::map(output, |o| Some(o)))),
+ Err(_) => Ok((it, OM::bind(|| None))),
+ }
+ }
+}
+
+pub fn opt<I, P>(parser: P) -> impl Parser<I, Output = Option<P::Output>>
+where
+ I: Input,
+ P: Parser<I>,
+{
+ Opt { parser }
+}
+
pub fn alpha<I>() -> impl Parser<I, Output = I>
where
I: Input,