1pub use crate::*;
2pub use sequence::*;
3pub use token::*;
4
5#[cfg(test)]
6mod tests;
7
8pub trait Transform<T> {
9 fn transform<'a>(&self, tokens: Vec<Token<'a, T>>) -> Vec<Token<'a, T>>;
10}
11
12pub struct ShallowTransform<T: Clone> {
13 pub data: T,
14}
15
16impl<T: Clone> Transform<T> for ShallowTransform<T> {
17 fn transform<'a>(&self, tokens: Vec<Token<'a, T>>) -> Vec<Token<'a, T>> {
18 if let Some(t) = tokens.first() {
19 vec![Token {
20 root: t.root,
21 t_type: TokenType::Leaf(
22 t.content_range().start..tokens.last().unwrap().content_range().end,
23 ),
24 data: self.data.clone(),
25 }]
26 } else {
27 vec![]
28 }
29 }
30}
31
32pub struct DeepTransform<T: Clone> {
33 pub data: T,
34}
35
36impl<T: Clone> Transform<T> for DeepTransform<T> {
37 fn transform<'a>(&self, tokens: Vec<Token<'a, T>>) -> Vec<Token<'a, T>> {
38 if let Some(t) = tokens.first() {
39 vec![Token {
40 root: t.root,
41 t_type: TokenType::Branch(tokens),
42 data: self.data.clone(),
43 }]
44 } else {
45 vec![]
46 }
47 }
48}
49
50pub struct RemoveTransform {}
51
52impl<T> Transform<T> for RemoveTransform {
53 fn transform<'a>(&self, _: Vec<Token<'a, T>>) -> Vec<Token<'a, T>> {
54 vec![]
55 }
56}
57
58pub fn repeat_until_no_change<T>(funcs: &Vec<&dyn Fn(&mut T) -> bool>, carry_over: &mut T) -> bool {
59 let mut changed_at_least_once = false;
60 let mut i = 0;
61 'outer: while i < funcs.len() {
62 let changed = funcs[i](carry_over);
63 if changed {
64 i = 0;
65 changed_at_least_once = true;
66 continue 'outer;
67 }
68 i += 1;
69 }
70 changed_at_least_once
71}