1
2
3
4
5
6
7
8
9
10
11
12
13
use crate::{KnowsVisitor, KnowsParent, KnowsValue, HasVisitorConstructor};

pub trait IsVisitor<'a>: KnowsParent<'a> + KnowsValue<'a> {
    fn visit<Child: KnowsVisitor<'a>>(&self, value: Child) -> Child::Visitor
    where Child::Visitor: HasVisitorConstructor<'a, Value = Child>,
          Self: Into<<Child::Visitor as KnowsParent<'a>>::Parent> + Clone
    {
        Child::Visitor::new_with_parent(self.clone().into(), value)
    }
}

impl<'a, T> IsVisitor<'a> for T
where T: KnowsParent<'a> + KnowsValue<'a> {}