parsy 0.2.1

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

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

#[derive(Clone)]
pub struct Flattened<
    T,
    S: IntoIterator<Item = T>,
    I: IntoIterator<Item = S>,
    P: Parser<I>,
    C: Container<T>,
> {
    parser: P,
    _i: PhantomData<I>,
    _t: PhantomData<T>,
    _c: PhantomData<C>,
}

impl<T, S: IntoIterator<Item = T>, I: IntoIterator<Item = S>, P: Parser<I>, C: Container<T>>
    Flattened<T, S, I, P, C>
{
    pub fn new(parser: P) -> Self {
        Self {
            parser,
            _i: PhantomData,
            _t: PhantomData,
            _c: PhantomData,
        }
    }
}

impl<T, S: IntoIterator<Item = T>, I: IntoIterator<Item = S>, P: Parser<I>, C: Container<T>>
    Parser<C> for Flattened<T, S, I, P, C>
{
    fn parse_inner(&self, input: &mut ParserInput) -> PResult<C> {
        let parsed = self.parser.parse(input)?;
        Ok(parsed.map(|data| C::from_iter(data.into_iter().flatten())))
    }
}