/// <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); }
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);
public virtual Task Accept(IEffectHandler handler) { return(handler.Handle(this)); }