public async Task <T> Run <T>(ISideEffect <T> sideEffect, CancellationToken cancellationToken = default) { var sideEffectHandlerType = GetSideEffectHandlerTypeFor(sideEffect.GetType()); var sideEffectHandler = _serviceProvider.GetRequiredService(sideEffectHandlerType) as ISideEffectHandler; if (sideEffectHandler == null) { throw new Exception($"Could not create a side effect handler for type {sideEffectHandlerType.Name}"); } var mi = sideEffectHandler.GetType().GetMethod("Handle"); var task = mi.Invoke(sideEffectHandler, new object[] { sideEffect, cancellationToken }) as Task; //var task = sideEffectHandler.AsDynamic().Handle((sideEffect as dynamic), cancellationToken); if (typeof(T) == typeof(Unit)) { await task; return(Unit.Value as dynamic); } else { var x = await(task as Task <T>); return(x); } }
public static IEffect <T> Of <T>(ISideEffect <T> sideEffect) { return(new FreeEffect <T, T>(sideEffect, Pure)); }
public FreeEffect(ISideEffect <TOutput> sideEffect, Func <TOutput, IEffect <T> > next) { SideEffect = sideEffect; Next = next; }
public void AddSideEffect(ISideEffect sideEffect) { sideEffects.Add(sideEffect); }
public MethodSideEffects(ISideEffect sideEffect) { _sideEffect = sideEffect; _rule = QualityRules.SideEffect; }