bool_logic/
visit_mut.rs

1use crate::ast::{All, Any, Expr, Not, Var};
2
3#[allow(unused_variables)]
4pub trait VisitMut<T> {
5    fn visit_mut_expr(&mut self, expr: &mut Expr<T>) {
6        walk_mut_expr(self, expr)
7    }
8
9    fn visit_mut_any(&mut self, Any(any): &mut Any<T>) {
10        walk_mut_expr_list(self, any);
11    }
12
13    fn visit_mut_all(&mut self, All(all): &mut All<T>) {
14        walk_mut_expr_list(self, all);
15    }
16
17    fn visit_mut_not(&mut self, Not(not): &mut Not<T>) {
18        walk_mut_not(self, not)
19    }
20
21    fn visit_mut_var(&mut self, var: &mut Var<T>) {}
22
23    fn visit_mut_const(&mut self, b: &mut bool) {}
24}
25
26pub fn walk_mut_expr<V, T>(v: &mut V, expr: &mut Expr<T>)
27where
28    V: VisitMut<T> + ?Sized,
29{
30    match expr {
31        Expr::Any(any) => {
32            v.visit_mut_any(any);
33        }
34        Expr::All(all) => {
35            v.visit_mut_all(all);
36        }
37        Expr::Not(not) => {
38            v.visit_mut_not(not);
39        }
40        Expr::Var(var) => {
41            v.visit_mut_var(var);
42        }
43        Expr::Const(b) => {
44            v.visit_mut_const(b);
45        }
46    }
47}
48
49pub fn walk_mut_expr_list<V, T>(v: &mut V, list: &mut [Expr<T>])
50where
51    V: VisitMut<T> + ?Sized,
52{
53    for expr in list {
54        v.visit_mut_expr(expr);
55    }
56}
57
58pub fn walk_mut_not<V, T>(v: &mut V, not: &mut Expr<T>)
59where
60    V: VisitMut<T> + ?Sized,
61{
62    v.visit_mut_expr(not);
63}