use super::WalkResult;
use crate::{Op, Operation, Symbol};
pub trait Visitor<T: ?Sized> {
type Output;
fn visit(&mut self, current: &T) -> WalkResult<Self::Output>;
}
impl<T: ?Sized, U, F> Visitor<T> for F
where
F: FnMut(&T) -> WalkResult<U>,
{
type Output = U;
#[inline]
fn visit(&mut self, op: &T) -> WalkResult<Self::Output> {
self(op)
}
}
pub trait OperationVisitor: Visitor<Operation> {}
impl<V> OperationVisitor for V where V: Visitor<Operation> {}
pub trait OpVisitor<T: Op>: Visitor<T> {}
impl<T: Op, V> OpVisitor<T> for V where V: Visitor<T> {}
pub trait SymbolVisitor: Visitor<dyn Symbol> {}
impl<V> SymbolVisitor for V where V: Visitor<dyn Symbol> {}