Ejemplo n.º 1
0
        /// <summary>
        ///   Executes the Effect using semantics from the provided effect handler.
        /// </summary>
        /// <param name="effectHandler">Effect handler to be used in execution.</param>
        /// <returns>A task computing the result of the Effect.</returns>
        public async Task <TResult> Run(IEffectHandler effectHandler)
        {
            var effectAwaiter = new EffectAwaiter <TResult>(this);
            await effectHandler.Handle(effectAwaiter).ConfigureAwait(false);

            return(effectAwaiter.GetResult());
        }
Ejemplo n.º 2
0
        public static async Task <TResult> Run <TResult>(this Eff <TResult> eff, IEffectHandler handler)
        {
            if (eff == null)
            {
                throw new ArgumentNullException(nameof(eff));
            }
            if (handler == null)
            {
                throw new ArgumentNullException(nameof(handler));
            }


            var result = default(TResult);
            var done   = false;

            while (!done)
            {
                switch (eff)
                {
                case SetException <TResult> setException:
                    await handler.Handle(setException);

                    break;

                case SetResult <TResult> setResult:
                    result = await handler.Handle(setResult);

                    done = true;
                    break;

                case Delay <TResult> delay:
                    eff = await handler.Handle(delay);

                    break;

                case Await <TResult> awaitEff:
                    eff = await handler.Handle(awaitEff);

                    break;

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

            return(result);
        }
Ejemplo n.º 3
0
        /// <summary>
        /// Runs supplied Eff computation using provided effect handler.
        /// </summary>
        /// <typeparam name="TResult"></typeparam>
        /// <param name="eff">Eff computation to be run.</param>
        /// <param name="handler">Effect handler to be used in execution.</param>
        public static async Task <TResult> Run <TResult>(this Eff <TResult> eff, IEffectHandler handler)
        {
            var result = default(TResult) !;
            var done   = false;

            while (!done)
            {
                switch (eff)
                {
                case ExceptionEff <TResult> setException:
                    await handler.Handle(setException);

                    break;

                case ResultEff <TResult> setResult:
                    result = await handler.Handle(setResult);

                    done = true;
                    break;

                case DelayEff <TResult> delay:
                    eff = await handler.Handle(delay);

                    break;

                case AwaitEff <TResult> awaitEff:
                    eff = await handler.Handle(awaitEff);

                    break;

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

            return(result);
        }
Ejemplo n.º 4
0
 public override Task Accept(IEffectHandler handler)
 {
     return(handler.Handle(this));
 }
Ejemplo n.º 5
0
 /// <summary>
 ///   Processes the awaiter using the provided effect handler.
 /// </summary>
 public override ValueTask Accept(IEffectHandler handler) => handler.Handle(this);
Ejemplo n.º 6
0
 public virtual Task Accept(IEffectHandler handler)
 {
     return(handler.Handle(this));
 }