use crate::parser::*;
use std::marker::PhantomData;
pub struct PAnd<P1, P2, A> {
first: P1,
second: P2,
_marker: PhantomData<A>,
}
pub fn pand<P1, P2, A>(first: P1, second: P2) -> PAnd<P1, P2, A> {
PAnd {
first,
second,
_marker: PhantomData,
}
}
impl<'a, K, O, P1, P2, A> ParserCore<'a, K, O> for PAnd<P1, P2, A>
where
K: PartialEq + Clone + 'a,
O: 'a,
A: 'a,
P1: Parser<'a, K, O>,
P2: Parser<'a, K, A>,
{
fn parse(&self, i: PInput<'a, K>) -> Result<PSuccess<'a, K, O>, PFail<'a, K>> {
let loc = i.loc;
let tokens = i.tokens;
let PSuccess { val, rest } = self.first.parse(i)?;
let PSuccess { val: _, rest: _ } = self.second.parse(PInput { tokens, loc })?;
Ok(PSuccess { val, rest })
}
}
impl<'a, K, O, P1, P2, A> Parser<'a, K, O> for PAnd<P1, P2, A>
where
K: PartialEq + Clone + 'a,
O: 'a,
A: 'a,
P1: Parser<'a, K, O>,
P2: Parser<'a, K, A>,
{
}