/// <summary> /// Create a new cancellation context and run the provided Aff in that context /// </summary> /// <param name="ma">Operation to run in the next context</param> /// <typeparam name="RT">Runtime environment</typeparam> /// <typeparam name="A">Bound value type</typeparam> /// <returns>An asynchronous effect that captures the operation running in context</returns> public static Aff <RT, A> localCancel <RT, A>(Aff <RT, A> ma) where RT : struct, HasCancel <RT> => AffMaybe <RT, A>(async rt => { var rt1 = rt.LocalCancel; using (rt1.CancellationTokenSource) { return(await ma.ReRun(rt1).ConfigureAwait(false)); } });
/// <summary> /// Safely use a disposable resource /// </summary> /// <param name="Acq">Acquire resource</param> /// <param name="Use">Use resource</param> public static Aff <R> use <H, R>(Aff <H> Acq, Func <H, Eff <R> > Use) where H : IDisposable => AffMaybe(async() => { var h = await Acq.ReRun().ConfigureAwait(false); if (h.IsFail) { return(h.Cast <R>()); } try { return(Use(h.Value).Run()); } finally { h.Value?.Dispose(); } });
/// <summary> /// Safely use a disposable resource /// </summary> /// <param name="Acq">Acquire resource</param> /// <param name="Use">Use resource</param> public static Aff <RT, R> use <RT, H, R>(Aff <H> Acq, Func <H, Eff <RT, R> > Use) where RT : struct, HasCancel <RT> where H : IDisposable => AffMaybe <RT, R>(async env => { var h = await Acq.ReRun().ConfigureAwait(false); if (h.IsFail) { return(h.Cast <R>()); } try { return(Use(h.Value).Run(env)); } finally { h.Value?.Dispose(); } });