pub fn factory<Input, P, R>(p: P) -> Factory<P, R> where
Input: Stream,
P: FnMut(&mut Input) -> R,
R: Parser<Input>,
Expand description
Constructs the parser lazily on each parse_*
call. This is similar to lazy
but it
takes Input
as an argument and allows different parsers to be returned on each call to
p
while still reporting the correct errors.
let mut parsers: Vec<FnOpaque<_, _>> = vec![opaque(|f| f(&mut digit())), opaque(|f| f(&mut letter()))];
let mut iter = parsers.into_iter().cycle();
let mut parser = many(factory(move |_| iter.next().unwrap()));
assert_eq!(parser.parse("1a2b3cd"), Ok(("1a2b3c".to_string(), "d")));