use crate::{error::Error, parser::*};
use std::marker::PhantomData;
#[derive(Clone)]
pub struct PInto<P, In, Out, K> {
p: P,
out: Out,
_marker: PhantomData<(K, In)>,
}
pub fn pinto<P, In, Out, K>(p: P, out: Out) -> PInto<P, In, Out, K> {
PInto {
p,
out,
_marker: PhantomData,
}
}
impl<'a, K, P, In, Out> ParserCore<'a, K, Out> for PInto<P, In, Out, K>
where
K: PartialEq + Clone + 'a,
In: Clone + 'a,
P: Parser<'a, K, In>,
Out: PartialEq + Clone,
{
fn parse(&self, i: PInput<'a, K>) -> Result<PSuccess<'a, K, Out>, Error<'a, K>> {
let PSuccess { val: _, rest } = self.p.parse(i)?;
Ok(PSuccess {
val: self.out.clone(),
rest,
})
}
}
impl<'a, K, P, In, Out> Parser<'a, K, Out> for PInto<P, In, Out, K>
where
K: PartialEq + Clone + 'a,
Out: PartialEq + Clone + 'a,
In: Clone + 'a,
P: Parser<'a, K, In>,
{
}