1use super::utils::Context;
2
3pub trait TokenTrait
6where
7 Self: Sized + PartialEq,
8{
9 fn match_char(c: char) -> Option<Self>;
11}
12
13pub trait TokenWrapper<T>
15where
16 Self: Sized,
17 T: TokenTrait,
18{
19 fn wrap(token: T, context: Context) -> Self;
21}
22
23impl<T> TokenWrapper<T> for T
24where
25 T: TokenTrait,
26{
27 fn wrap(token: T, _: Context) -> Self {
28 token
29 }
30}
31
32pub trait TokenMatch<T>
34where
35 T: TokenTrait,
36{
37 fn matches_token(&self, t: &T) -> bool;
39}
40
41impl<T> TokenMatch<T> for T
42where
43 T: TokenTrait,
44{
45 fn matches_token(&self, t: &T) -> bool {
46 self == t
47 }
48}
49
50impl<T> TokenMatch<T> for Vec<T>
51where
52 T: TokenTrait,
53{
54 fn matches_token(&self, t: &T) -> bool {
55 for token in self {
56 if token == t {
57 return true;
58 }
59 }
60 false
61 }
62}