pub trait MachineTrans<X> {
type Observation;
fn transit(self: &mut Self, x: X);
fn observe(self: &Self) -> Self::Observation;
fn initial(self: &mut Self);
}
pub trait Final {
type FinalValue;
fn is_final(self: Self) -> Option<Self::FinalValue>;
}
pub struct Comp<M0, M1> {
pub m0: M0,
pub m1: M1,
}
impl<X, M0, M1> MachineTrans<X> for Comp<M0, M1>
where
M0: MachineTrans<X>,
<M0 as MachineTrans<X>>::Observation: Final,
M1: MachineTrans<<<M0 as MachineTrans<X>>::Observation as Final>::FinalValue>,
{
type Observation = <M1 as MachineTrans<
<<M0 as MachineTrans<X>>::Observation as Final>::FinalValue,
>>::Observation;
fn transit(self: &mut Self, x: X) {
self.m0.transit(x);
if let Some(y) = self.m0.observe().is_final() {
self.m0.initial();
self.m1.transit(y);
}
}
fn observe(self: &Self) -> Self::Observation {
self.m1.observe()
}
fn initial(self: &mut Self) {
self.m0.initial();
self.m1.initial();
}
}