tuck5/transform/
mod.rs

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}