use crate::node::{Node, NodeKind};
pub trait Visitor {
fn visit_node(&mut self, node: &Node) {
walk(self, node);
}
}
pub fn walk<V: Visitor + ?Sized>(v: &mut V, node: &Node) {
if let Some(inner) = node.kind.as_reader_macro_inner() {
v.visit_node(inner);
return;
}
match &node.kind {
NodeKind::List(items) | NodeKind::Map(items) | NodeKind::Vector(items) => {
for item in items {
v.visit_node(item);
}
}
_ => {}
}
}