parser_fuck/combinators/
not.rs1use crate::*;
2use std::marker::PhantomData;
3
4#[derive(Debug, PartialEq, Eq, Clone)]
6pub struct Not<A, I = ()> {
7 a: A,
8 _i: PhantomData<I>,
9}
10impl<I: TimeTravel, A> Not<A, I>
11where
12 A: Parser<I>,
13{
14 #[inline]
15 pub fn new(a: A) -> Self {
16 Self { a, _i: PhantomData }
17 }
18}
19impl<I: TimeTravel, A> Parser<I> for Not<A, I>
20where
21 A: Parser<I>,
22{
23 type Output = ();
24
25 fn parse(&self, input: I) -> Option<Self::Output> {
26 let a = self.a.parse(input.ref_clone());
27 if let Some(_) = a {
28 None
29 } else {
30 Some(())
31 }
32 }
33}
34
35#[cfg(test)]
36mod tests {
37 use crate::*;
38
39 #[test]
40 fn test() {
41 let code = "asd";
42 let span = code.span();
43 let a = substr("acd");
44 let x = a.not();
45
46 let r = x.parse(span);
47 println!("{:?}", r);
48 assert_eq!(r, Some(()))
49 }
50}