pub trait Visit { type Return; fn visit(&self, target: T) -> Return; } pub trait ImpureVisit { type Shard; type Return; fn impure_visit(&self, target: T) -> (Shard, Return); fn merge(&mut self, s: Shard); } pub struct OverlayVisitor(VBase, VOver); impl Visitor for OverlayVisitor where VBase: Visitor>, VOver: Visitor> { }