bool_logic/
visit_mut.rs

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