use std::sync::Arc;
use crate::{
error::Error,
prelude::{PInput, PSuccess, Parser, ParserCore},
};
#[derive(Clone)]
pub struct PMapError<'a, K, P>
where
K: PartialEq + Clone + 'a,
{
parser: P,
f: Arc<dyn Fn(Error<'a, K>) -> Error<'a, K>>,
}
pub fn pmap_error<'a, K, F, P>(parser: P, f: F) -> PMapError<'a, K, P>
where
K: PartialEq + Clone + 'a,
F: Fn(Error<'a, K>) -> Error<'a, K> + 'static,
{
PMapError {
parser,
f: Arc::new(f),
}
}
impl<'a, K, P, O> ParserCore<'a, K, O> for PMapError<'a, K, P>
where
K: PartialEq + Clone + 'a,
O: Clone + 'a,
P: Parser<'a, K, O>,
{
fn parse(&self, i: PInput<'a, K>) -> Result<PSuccess<'a, K, O>, Error<'a, K>> {
match self.parser.parse(i) {
Ok(psuccess) => Ok(psuccess),
Err(perror) => Err((self.f)(perror)),
}
}
}
impl<'a, K, P, O> Parser<'a, K, O> for PMapError<'a, K, P>
where
K: PartialEq + Clone + 'a,
P: Parser<'a, K, O>,
O: Clone + 'a,
{
}