then_ignore, ignore_then
This commit is contained in:
parent
0d4ea42678
commit
e6ce2cf34d
26
src/lib.rs
26
src/lib.rs
@ -52,21 +52,21 @@ mod tests {
|
||||
let digit = || one_of("1234567890");
|
||||
assert_eq!(digit().parse("3"), Ok(("3", "")));
|
||||
|
||||
let digits = || repeated(digit()).at_least(1);
|
||||
|
||||
let json_number_inner = choice((
|
||||
seq((
|
||||
repeated(digit()).at_least(1),
|
||||
literal(".").then(repeated(digit())).optional(),
|
||||
))
|
||||
.map(|(mut digits, maybe_more)| {
|
||||
if let Some((point, more)) = maybe_more {
|
||||
digits.push(point);
|
||||
digits.extend(more.into_iter());
|
||||
}
|
||||
digits.into_iter().collect::<String>()
|
||||
}),
|
||||
seq((literal("."), repeated(digit()).at_least(1))).map(|(_point, digits)| {
|
||||
seq((digits(), literal(".").ignore_then(digits()).optional())).map(
|
||||
|(mut digits, maybe_decimal)| {
|
||||
if let Some(decimal_digits) = maybe_decimal {
|
||||
digits.push(".");
|
||||
digits.extend(decimal_digits.into_iter());
|
||||
}
|
||||
digits.into_iter().collect::<String>()
|
||||
},
|
||||
),
|
||||
literal(".").ignore_then(digits()).map(|decimal_digits| {
|
||||
let mut d = vec!["."];
|
||||
d.extend(digits.into_iter());
|
||||
d.extend(decimal_digits.into_iter());
|
||||
d.into_iter().collect::<String>()
|
||||
}),
|
||||
))
|
||||
|
@ -44,6 +44,32 @@ pub trait Parser<I, O, E> {
|
||||
BoxedParser::new(crate::sequence::tuple2(self, next_parser))
|
||||
}
|
||||
|
||||
fn ignore_then<'a, P, O2>(self, next_parser: P) -> BoxedParser<'a, I, O2, E>
|
||||
where
|
||||
Self: Sized + 'a,
|
||||
I: 'a,
|
||||
O: 'a,
|
||||
O2: 'a,
|
||||
E: 'a,
|
||||
P: Parser<I, O2, E> + 'a,
|
||||
{
|
||||
BoxedParser::new(crate::sequence::tuple2(self, next_parser))
|
||||
.map(|(_, next_output)| next_output)
|
||||
}
|
||||
|
||||
fn then_ignore<'a, P, O2>(self, next_parser: P) -> BoxedParser<'a, I, O, E>
|
||||
where
|
||||
Self: Sized + 'a,
|
||||
I: 'a,
|
||||
O: 'a,
|
||||
O2: 'a,
|
||||
E: 'a,
|
||||
P: Parser<I, O, E> + 'a,
|
||||
{
|
||||
BoxedParser::new(crate::sequence::tuple2(self, next_parser))
|
||||
.map(|(this_output, _)| this_output)
|
||||
}
|
||||
|
||||
fn optional<'a>(self) -> BoxedParser<'a, I, Option<O>, E>
|
||||
where
|
||||
I: Clone + 'a,
|
||||
|
Loading…
Reference in New Issue
Block a user