use crate::{Direct, DirectMut, Director, DirectorVisitor};
#[derive(Debug)]
pub struct Visitor<'dv, D: ?Sized, V: ?Sized>(DirectorVisitor<'dv, D, V>);
impl<'dv, D: ?Sized, V: ?Sized> Visitor<'dv, D, V> {
pub(crate) fn new(data: crate::DirectorVisitor<'dv, D, V>) -> Self {
Self(data)
}
pub fn visit<N>(this: Self, node: &N)
where
D: Direct<V, N>,
N: ?Sized,
{
<D as Direct<V, N>>::direct(Director::new(this.0), node)
}
pub fn visit_mut<N>(this: Self, node: &mut N)
where
D: DirectMut<V, N>,
N: ?Sized,
{
<D as DirectMut<V, N>>::direct_mut(Director::new(this.0), node)
}
}
impl<D: ?Sized, V: ?Sized> std::ops::Deref for Visitor<'_, D, V> {
type Target = V;
fn deref(&self) -> &Self::Target {
self.0.visit
}
}
impl<D: ?Sized, V: ?Sized> std::ops::DerefMut for Visitor<'_, D, V> {
fn deref_mut(&mut self) -> &mut Self::Target {
self.0.visit
}
}
pub trait Visit<N: ?Sized> {
fn visit<D>(visitor: Visitor<'_, D, Self>, node: &N)
where
D: Direct<Self, N> + ?Sized,
{
Visitor::visit(visitor, node);
}
}
pub trait VisitMut<N: ?Sized> {
fn visit_mut<D>(visitor: Visitor<'_, D, Self>, node: &mut N)
where
D: DirectMut<Self, N> + ?Sized,
{
Visitor::visit_mut(visitor, node);
}
}