/// <summary> /// Executes the Eff computation 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 eff computation.</returns> public async Task Run(IEffectHandler effectHandler) { var awaiter = GetAwaiterCore(); await awaiter.Accept(effectHandler).ConfigureAwait(false); awaiter.GetResult(); }
public void Setup() { const int offset = 50_000; // prevent task caching from kicking in _data = Enumerable.Range(0, 100).Select(x => x + offset).ToArray(); _handler = new DefaultEffectHandler(); }
/// <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()); }
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); }
/// <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); }
/// <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 Task Run(this Eff eff, IEffectHandler handler) => eff.RunCore(handler);
public override Task Accept(IEffectHandler handler) { SetException(new DivideByZeroException()); throw new NotImplementedException(); }
public override Task Accept(IEffectHandler handler) { return(handler.Handle(this)); }
/// <summary> /// Processes the awaiter using the provided effect handler. /// </summary> public override ValueTask Accept(IEffectHandler handler) => handler.Handle(this);
/// <summary> /// Helper method for interpreting untyped Eff instances /// </summary> internal abstract Task RunCore(IEffectHandler handler);
public ValuesController() { handler = new DefaultEffectHandler(); }
public virtual Task Accept(IEffectHandler handler) { return(handler.Handle(this)); }
public void Setup() { _data = Enumerable.Range(1, 100).ToArray(); _handler = new DefaultEffectHandler(); }
public abstract Task Accept(IEffectHandler handler);
public PushEffectHandlerEffect(IEffectHandler handler) { Handler = handler; }
public static PushEffectHandlerEffect Push(IEffectHandler handler) => new PushEffectHandlerEffect(handler);