use nom::branch::alt;
use nom::bytes::complete::tag;
use nom::combinator::map;
use nom::error::ParseError;
use crate::parsers::{ParseResult, Span};
#[allow(dead_code)]
pub fn empty_or<'a, F, O, E: ParseError<Span<'a>>>(
inner: F,
) -> impl FnMut(Span<'a>) -> ParseResult<'a, Option<O>, E>
where
F: FnMut(Span<'a>) -> ParseResult<'a, O, E>,
{
let empty_parser = map(tag("()"), |_: Span| None);
let inner_parser = map(inner, |o: O| Some(o));
alt((empty_parser, inner_parser))
}
#[cfg(test)]
mod tests {
use nom::character::complete::alpha1;
use crate::parsers::Match;
use super::*;
#[test]
fn empty_or_works() {
let mut parser = empty_or(alpha1::<Span<'static>, crate::parsers::ParseError>);
assert!(parser(Span::new("()")).is_exactly(None));
assert!(parser(Span::new("abc")).is_exactly(Some("abc")));
}
}