1use binator_core::{
2 Parse,
3 Parsed,
4 Success,
5};
6
7#[derive(Clone)]
9pub struct And<ParserA, ParserB> {
10 parser_a: ParserA,
11 parser_b: ParserB,
12}
13
14impl<TokenA, Stream, Context, ParserA, TokenB, ParserB> Parse<Stream, Context>
15 for And<ParserA, ParserB>
16where
17 ParserA: Parse<Stream, Context, Token = TokenA>,
18 ParserB: Parse<Stream, Context, Token = TokenB>,
19{
20 type Token = (TokenA, TokenB);
21
22 fn parse(&mut self, stream: Stream) -> Parsed<(TokenA, TokenB), Stream, Context> {
23 let Success { token, stream } = self.parser_a.parse(stream)?;
24
25 self
26 .parser_b
27 .parse(stream)
28 .map_token(|token_b| (token, token_b))
29 }
30}
31
32pub fn and<TokenA, Stream, Context, ParserA, TokenB, ParserB>(
34 parser_a: ParserA, parser_b: ParserB,
35) -> And<ParserA, ParserB>
36where
37 ParserA: Parse<Stream, Context, Token = TokenA>,
38 ParserB: Parse<Stream, Context, Token = TokenB>,
39{
40 And { parser_a, parser_b }
41}