pub trait Visitor<'a, 'b> {
type Producer: ExprProducer<'a, 'b>;
// Required methods
fn visit_expr(&mut self, expr: CExpr<'b>) -> Option<&'a Expr<'a>>;
fn detach_allocator(&self) -> Option<&'a Allocator<'a>>;
// Provided methods
fn visit_expr_(&mut self, expr: CExpr<'b>) -> Option<Expr<'a>> { ... }
fn visit_binding(&mut self, _: &Symbol) -> Option<Symbol> { ... }
fn visit_type(&mut self, _: &'b ArcType) -> Option<ArcType> { ... }
fn visit_pattern(&mut self, expr: &'b Pattern) -> Option<Pattern> { ... }
fn visit_alt(&mut self, alt: &'b Alternative<'b>) -> Option<Alternative<'a>> { ... }
fn detach_producer(&self) -> Option<Self::Producer> { ... }
fn producer(&self) -> Self::Producer { ... }
fn allocator(&self) -> &'a Allocator<'a> { ... }
}