use std::ops::ControlFlow;
use crate::Transition;
pub trait Workflow {
type Result;
fn run(self) -> Self::Result
where
Self: WorkflowState<Self::Result> + Sized,
{
let mut workflow: Box<dyn WorkflowState<Self::Result>> = Box::new(self);
loop {
match workflow.next() {
ControlFlow::Continue(next) => workflow = next,
ControlFlow::Break(result) => return result,
}
}
}
fn result(self, result: Self::Result) -> Transition<Self::Result>
where
Self: Sized,
{
ControlFlow::Break(result)
}
}
pub trait WorkflowState<Result> {
fn next(self: Box<Self>) -> Transition<Result>;
}