parsy 0.2.1

An easy-to-use, efficient parser combinators library
Documentation
use std::marker::PhantomData;

use crate::{PResult, Parser, ParserInput};

#[derive(Clone)]
pub struct Map<F, FP: Parser<F>, O, OF: Fn(F) -> O + Clone> {
    parser: FP,
    mapper: OF,
    _f: PhantomData<F>,
    _o: PhantomData<O>,
}

impl<F, FP: Parser<F>, O, OF: Fn(F) -> O + Clone> Map<F, FP, O, OF> {
    pub fn new(from: FP, mapper: OF) -> Self {
        Self {
            parser: from,
            mapper,
            _f: PhantomData,
            _o: PhantomData,
        }
    }
}

impl<F, FP: Parser<F>, O, OF: Fn(F) -> O + Clone> Parser<O> for Map<F, FP, O, OF> {
    fn parse_inner(&self, input: &mut ParserInput) -> PResult<O> {
        Ok(self.parser.parse(input)?.map(&self.mapper))
    }
}