namespace Rehlert.RoP.Extensions; public static class OnSuccessExtensions { public static Result OnSuccess(this Result value, Func> func) { var result = value.Match( ok => func(ok.Value), err => err.Value ); return result; } public static async Task> OnSuccess( this Result value, Func>> func ) { var result = await value.Match( ok => func(ok.Value), err => Task.FromResult>(err.Value) ); return result; } public static async Task> OnSuccess( this Task> value, Func>> func ) { var valRes = await value; var result = await valRes.Match( ok => func(ok.Value), err => Task.FromResult>(err.Value) ); return result; } public static async Task> OnSuccess( this Task> value, Func> func ) { var valRes = await value; var result = valRes.Match( ok => func(ok.Value), err => err.Value ); return result; } public static async Task OnSuccess( this Task> value, Func func ) { var valRes = await value; await valRes.Match( ok => func(ok.Value), err => Task.CompletedTask ); } public static async Task OnSuccess( this Task> value, Action action ) { var valRes = await value; valRes.Match( ok => action(ok.Value), _ => { } ); } public static async Task OnSuccess( this Result value, Func func ) { await value.Match( ok => func(ok.Value), _ => Task.CompletedTask ); } public static void OnSuccess( this Result value, Action action ) { value.Match( ok => action(ok.Value), _ => { } ); } public static Result<(T1, T2), TErr> Combine(this Result r1, Result r2) { if (r1 is Result.Error err) return err.Value; if (r2 is Result.Error err2) return err2.Value; return (r1.UnwrapOk().Value, r2.UnwrapOk().Value); } public static async Task> Combine(this Task> r1, Result r2) { var val = await r1; return val.Combine(r2); } }