namespace MS.Microservice.Core.Functional; public static partial class F { public static Task Async(T t) => Task.FromResult(t); #region Task extensions extension(Task task) { public async Task Map(Func f) => f(await task); public async Task Bind(Func> f) => await f(await task); public async Task OrElse(Func> fallback) { try { return await task.ConfigureAwait(false); } catch { return await fallback().ConfigureAwait(false); } } public Task Recover(Func fallback) => task.ContinueWith(t => t.Status == TaskStatus.Faulted ? fallback(t.Exception!) : t.Result); /// /// 在成功和失败的情况下都会接受到一个函数来处理结果,成功时传入结果,失败时传入异常 /// /// /// /// public async Task Map(Func Faulted, Func Completed) => await task.ContinueWith(t => t.Status == TaskStatus.Faulted ? Faulted(t.Exception!) : Completed(t.Result)).ConfigureAwait(false); public Task Select(Func map) => task.ContinueWith(t => map(t.Result)); public async Task SelectMany(Func> bind) { var value = await task.ConfigureAwait(false); return await bind(value).ConfigureAwait(false); } public async Task SelectMany(Func> bind) { await task.ConfigureAwait(false); return await bind(Unit.Default).ConfigureAwait(false); } } #endregion #region Task extensions extension(Task task) { public async Task SelectMany( Func> bind, Func project) { await task.ConfigureAwait(false); var u = await bind(Unit.Default).ConfigureAwait(false); return project(Unit.Default, u); } public async Task Select(Func map) { await task.ConfigureAwait(false); return map(Unit.Default); } } #endregion extension(Task> f) { public async Task Apply(Task arg) => (await f)(await arg); } extension(Task> f) { public Task> Apply(Task arg) => f.Map(func => func.Curry()).Apply(arg); } public static async Task Retry(int retries, int delayMillis, Func> start) { try { return await start().ConfigureAwait(false); } catch when (retries > 0) { await Task.Delay(delayMillis).ConfigureAwait(false); return await Retry(retries - 1, delayMillis * 2, start).ConfigureAwait(false); } } }