1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
use crate::*; pub struct Transform<Iter, A, F, T> where Iter: Iterator + Clone, A: Parser<Iter>, F: Fn(A::Output) -> Option<T>, { a: A, f: F, _i: PhantomData<(Iter, T)>, } impl<Iter, A, F, T> Transform<Iter, A, F, T> where Iter: Iterator + Clone, A: Parser<Iter>, F: Fn(A::Output) -> Option<T>, { pub(crate) fn new(a: A, f: F) -> Self { Self { a, f, _i: Default::default(), } } } impl<Iter, A, F, T> Parser<Iter> for Transform<Iter, A, F, T> where Iter: Iterator + Clone, A: Parser<Iter>, F: Fn(A::Output) -> Option<T>, { type Output = T; fn parse(&self, i: Iter) -> Option<(Iter, Self::Output)> { let (i, a) = self.a.parse(i)?; Some((i, (self.f)(a)?)) } } #[cfg(test)] mod tests { use crate::prelude::*; #[test] fn test() { assert_eq!( ('a'.then('b')) .transform(|x| { let mut s = String::new(); s.push(x.0); s.push(x.1); Some(s) }) .parse_str("abc"), Some(("c", String::from("ab"))) ) } }