pub trait Step, E, O> { fn step(&mut self, context: &mut C) -> Result; fn finish(&mut self, context: &mut C) -> Result { loop { if let Ok(outcome) = self.step(context)?.try_into() { return Ok(outcome); } } } } pub trait StepBack, E, O> { fn step_back(&mut self, context: &mut C) -> Result; }