1use super::{Visit, VisitMut};
2use std::fmt;
3
4pub trait Node: fmt::Debug {
5 fn visit<V: Visit>(&self, visit: V)
6 where
7 Self: Sized;
8
9 fn visit_mut<V: VisitMut>(&mut self, visit: V);
10}
11
12impl<T: Node> Node for Option<T> {
13 fn visit<V: Visit>(&self, visit: V)
14 where
15 Self: Sized,
16 {
17 if let Some(node) = self {
18 node.visit(visit);
19 }
20 }
21
22 fn visit_mut<V: VisitMut>(&mut self, visit: V) {
23 if let Some(node) = self {
24 node.visit_mut(visit);
25 }
26 }
27}
28
29impl<T: Node> Node for &mut T {
30 fn visit<V: Visit>(&self, visit: V)
31 where
32 Self: Sized,
33 {
34 (**self).visit(visit)
35 }
36
37 fn visit_mut<V: VisitMut>(&mut self, visit: V) {
38 (**self).visit_mut(visit)
39 }
40}