pub trait OutputAlg<From> {
type Output;
fn output(from: From) -> Self::Output;
}
pub trait JsonOutAlg {
type Json<From>: OutputAlg<From>;
}
pub trait FileOutAlg {
type File<From>: OutputAlg<From>;
}
pub trait OutputKindAlg<Interpreter: ?Sized, From> {
type Transform: OutputAlg<From>;
}
pub struct JsonOut;
impl<Interpreter, From> OutputKindAlg<Interpreter, From> for JsonOut
where
Interpreter: JsonOutAlg + ?Sized,
{
type Transform = Interpreter::Json<From>;
}
pub struct FileOut;
impl<Interpreter, From> OutputKindAlg<Interpreter, From> for FileOut
where
Interpreter: FileOutAlg + ?Sized,
{
type Transform = Interpreter::File<From>;
}