parsy 0.16.3

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

use perfect_derive::perfect_derive;

use crate::{Parser, ParserInput, ParserNonConstUtils, ParserResult, containers::Container};

/// See [`flattened`](`crate::ParserConstUtils::flattened`)
#[perfect_derive(Debug, Clone, Copy)]
pub struct Flattened<
    T,
    S: IntoIterator<Item = T>,
    I: IntoIterator<Item = S>,
    P: Parser<I>,
    C: Container<T>,
> {
    parser: P,
    _p: PhantomData<(I, T, C)>,
}

impl<T, S: IntoIterator<Item = T>, I: IntoIterator<Item = S>, P: Parser<I>, C: Container<T>>
    Flattened<T, S, I, P, C>
{
    pub const fn new(parser: P) -> Self {
        Self {
            parser,
            _p: 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) -> ParserResult<C> {
        let parsed = self.parser.parse(input)?;
        Ok(parsed.map(|data| C::from_iter(data.into_iter().flatten())))
    }
}