private static async Task <List <TResult> > Run <TResult>(EffStateMachine <TResult> stateMachine) { while (true) { stateMachine.MoveNext(); switch (stateMachine.Position) { case StateMachinePosition.Result: return(new List <TResult> { stateMachine.Result }); case StateMachinePosition.Exception: throw stateMachine.Exception !; case StateMachinePosition.TaskAwaiter: await stateMachine.TaskAwaiter !.Value; break; case StateMachinePosition.EffAwaiter: var awaiter = stateMachine.EffAwaiter !; var handler = new NonDetEffectHandlerImpl <TResult>(stateMachine); await awaiter.Accept(handler); return(handler.Results); default: throw new Exception($"Invalid state machine position {stateMachine.Position}."); } } }