mipl 0.2.1

Minimal Imperative Parsing Library
Documentation
use crate::prelude::*;

/// Consume tokens into a new parser while the concrete
/// parser returns something. Stop consuming if it returns
/// `None`.
pub struct CollectWhile<Op: ConcreteParser>(Op);
impl<Op> ConcreteSubparser<Op> for CollectWhile<Op>
where
    Op: ConcreteParser
{
    fn subparse
    (value: <Op>::Input, parser: &mut Parser) -> Parser
    where
    Op: concrete_parser::ContainerCp
    {
        let op = Op::new(value);

        let mut tokens = Tokens::new_empty();

        loop {
            if let Some(token) = op.try_next_token(parser) {
                tokens.add_token(token);
            } else {
                break;
            }
        }

        Parser::new(tokens)
    }
}