Exemplo n.º 1
0
        private static async Task <Maybe <TResult> > Run <TResult>(EffStateMachine <TResult> stateMachine)
        {
            while (true)
            {
                stateMachine.MoveNext();

                switch (stateMachine.Position)
                {
                case StateMachinePosition.Result:
                    return(Maybe <TResult> .Just(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 MaybeEffectHandlerImpl <TResult>(stateMachine);
                    await awaiter.Accept(handler);

                    return(handler.Result);

                default:
                    throw new Exception($"Invalid state machine position {stateMachine.Position}.");
                }
            }
        }
Exemplo n.º 2
0
        public static Maybe <TResult> Run <TResult>(Eff <TResult> eff)
        {
            switch (eff)
            {
            case ExceptionEff <TResult> setException:
                throw setException.Exception;

            case ResultEff <TResult> setResult:
                return(Maybe <TResult> .Just(setResult.Result));

            case DelayEff <TResult> delay:
                return(Run(delay.Continuation.MoveNext()));

            case AwaitEff <TResult> awaitEff:
                var handler = new MaybeEffectHandlerImpl <TResult>(awaitEff.Continuation);
                awaitEff.Awaiter.Accept(handler);
                return(handler.Result);

            default:
                throw new NotSupportedException($"{eff.GetType().Name}");
            }
        }