1use binator_core::{
2 Contexting,
3 Parse,
4 Parsed,
5};
6
7#[derive(Clone)]
9pub struct Not<Parser> {
10 parser: Parser,
11}
12
13#[derive(Debug, Clone, PartialEq, Eq)]
15pub enum NotAtom<Token, Stream> {
16 ParserParsedSuccess(Token, Stream),
18 ParserParsedInvalid,
20}
21
22impl<Stream, Context, Parser> Parse<Stream, Context> for Not<Parser>
23where
24 Stream: Clone,
25 Context: Contexting<NotAtom<Parser::Token, Stream>>,
26 Parser: Parse<Stream, Context>,
27{
28 type Token = Context;
29
30 fn parse(&mut self, stream: Stream) -> Parsed<Context, Stream, Context> {
31 match self.parser.parse(stream.clone()) {
32 Parsed::Success { token, stream } => {
33 Parsed::Failure(Context::new(NotAtom::ParserParsedSuccess(token, stream)))
34 }
35 Parsed::Failure(context) => Parsed::Success {
36 token: context,
37 stream,
38 },
39 Parsed::Error(context) => Parsed::Error(context.add(NotAtom::ParserParsedInvalid)),
40 }
41 }
42}
43
44pub fn not<Stream, Context, Parser>(parser: Parser) -> Not<Parser>
47where
48 Stream: Clone,
49 Context: Contexting<NotAtom<Parser::Token, Stream>>,
50 Parser: Parse<Stream, Context>,
51{
52 Not { parser }
53}