use crate::node::{Node, NodeField};
use crate::context::GCLock;
pub trait Visitor<'gc> {
fn visit_node(&mut self, node: &'gc Node<'gc>) {
node.visit_children(self);
}
}
#[derive(Debug, Copy, Clone)]
pub struct Path<'gc> {
pub parent: &'gc Node<'gc>,
pub field: NodeField,
}
impl<'gc> Path<'gc> {
pub fn new(parent: &'gc Node<'gc>, field: NodeField) -> Path<'gc> {
Path { parent, field }
}
}
#[derive(Debug)]
pub enum TransformResult<T> {
Unchanged,
Removed,
Changed(T),
Expanded(Vec<T>),
}
pub trait VisitorMut<'gc> {
fn call(
&mut self,
ctx: &'gc GCLock<'_, '_>,
node: &'gc Node<'gc>,
path: Option<Path<'gc>>,
) -> TransformResult<&'gc Node<'gc>>;
}