use super::*;
pub trait UnitUnary: UnitCompound {
type Inner: Unit;
fn unary(inner: Self::Inner) -> Self;
fn inner(&self) -> Self::Inner;
fn modify_inner<F, I, V>(&self, f: F) -> V where
F: FnOnce(Self::Inner) -> I,
V: UnitUnary<Inner=I>,
{
V::unary(f(self.inner()))
}
fn step_inner_down(&self) -> Option<Self> where Self::Inner: UnitStep {
Some(Self::unary(self.inner().step_down()?))
}
fn step_inner_up(&self) -> Option<Self> where Self::Inner: UnitStep {
Some(Self::unary(self.inner().step_up()?))
}
}