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}.");
                }
            }
        }