use crate::parser::*;
pub struct PMany<P> {
p: P,
}
pub fn pmany<P>(p: P) -> PMany<P> {
PMany { p }
}
impl<'a, K, O, P> ParserCore<'a, K, Vec<O>> for PMany<P>
where
K: PartialEq + Clone + 'a,
O: 'a,
P: Parser<'a, K, O>,
{
fn parse(&self, i: PInput<'a, K>) -> Result<PSuccess<'a, K, Vec<O>>, PFail<'a, K>> {
let mut vals: Vec<O> = vec![];
let mut input = i;
while let Ok(PSuccess { val, rest }) = self.p.parse(input.clone()) {
vals.push(val);
input = rest;
}
Ok(PSuccess {
val: vals,
rest: input,
})
}
}
impl<'a, K, O, P> Parser<'a, K, Vec<O>> for PMany<P>
where
K: PartialEq + Clone + 'a,
O: 'a,
P: Parser<'a, K, O>,
{
}