From 67861a4df8a5abdd70651d47cf265b20c41d2acc Mon Sep 17 00:00:00 2001 From: John Turner Date: Wed, 26 Nov 2025 19:22:50 +0000 Subject: add SeparatedByWithOptTrailing combinator --- src/lib.rs | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/src/lib.rs b/src/lib.rs index 0d5a164..220adb5 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -190,6 +190,19 @@ pub trait Parser: Sized { } } + fn separated_by_with_opt_trailing

( + self, + delimiter: P, + ) -> impl ParserIter + where + P: Parser, + { + SeparatedByWithOptTrailing { + parser: self, + delimiter, + } + } + fn find(self) -> impl ParserIter { Find { parser: self } } @@ -342,6 +355,42 @@ where } } +struct SeparatedByWithOptTrailing { + parser: P1, + delimiter: P2, +} + +impl ParserIter for SeparatedByWithOptTrailing +where + I: Input, + P1: Parser, + P2: Parser, +{ + type Item = P1::Output; + + fn next( + &self, + it: InputIter, + _: &mut ParserIterState, + ) -> Option> { + if it.is_finished() { + None + } else { + let (rest, output) = match self.parser.run::(it) { + Ok((rest, output)) => (rest, output), + Err(rest) => return Some(Err(rest)), + }; + + let rest = match self.delimiter.check(rest.clone()) { + Ok((rest, _)) => rest, + _ => rest, + }; + + Some(Ok((rest, output))) + } + } +} + struct AtLeast

{ parser: P, count: usize, -- cgit v1.2.3