namespace Just.Railway; public static partial class ResultExtensions { #region Match<> [Pure] public static R Match(this in Result result, Func onSuccess, Func onFailure) { return result.State switch { ResultState.Success => onSuccess(), ResultState.Error => onFailure(result.Error!), _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static Task Match(this in Result result, Func> onSuccess, Func> onFailure) { return result.State switch { ResultState.Success => onSuccess(), ResultState.Error => onFailure(result.Error!), _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static async Task Match(this Task resultTask, Func onSuccess, Func onFailure) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => onSuccess(), ResultState.Error => onFailure(result.Error!), _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } [Pure] public static async Task Match(this Task resultTask, Func> onSuccess, Func> onFailure) { var result = await resultTask.ConfigureAwait(false); var matchTask = result.State switch { ResultState.Success => onSuccess(), ResultState.Error => onFailure(result.Error!), _ => throw new ResultNotInitializedException(nameof(resultTask)) }; return await matchTask.ConfigureAwait(false); } #endregion #region Map<> [Pure] public static Result Map(this in Result result, Func mapping) { return result.State switch { ResultState.Success => mapping(), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static async Task> Map(this Result result, Func> mapping) { return result.State switch { ResultState.Success => await mapping().ConfigureAwait(false), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static async Task> Map(this Task resultTask, Func mapping) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => mapping(), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } [Pure] public static async Task> Map(this Task resultTask, Func> mapping) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => await mapping().ConfigureAwait(false), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } #endregion #region Bind<> [Pure] public static Result Bind(this in Result result, Func binding) { return result.State switch { ResultState.Success => binding(), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static Task Bind(this in Result result, Func> binding) { return result.State switch { ResultState.Success => binding(), ResultState.Error => Task.FromResult(result.Error!), _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static async Task Bind(this Task resultTask, Func binding) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => binding(), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } [Pure] public static async Task Bind(this Task resultTask, Func> binding) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => await binding().ConfigureAwait(false), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } [Pure] public static Result Bind(this in Result result, Func> binding) { return result.State switch { ResultState.Success => binding(), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static Task> Bind(this in Result result, Func>> binding) { return result.State switch { ResultState.Success => binding(), ResultState.Error => Task.FromResult>(result.Error!), _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static async Task> Bind(this Task resultTask, Func> binding) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => binding(), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } [Pure] public static async Task> Bind(this Task resultTask, Func>> binding) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => await binding().ConfigureAwait(false), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } #endregion #region Append #region <> [Pure] public static Result Append(this in Result result, Result next) { Error? error = null; if ((result.State & next.State) == ResultState.Bottom) { throw new ResultNotInitializedException(string.Join(';', GetBottom(result.State, next.State))); static IEnumerable GetBottom(ResultState r1, ResultState r2) { if (r1 == ResultState.Bottom) yield return nameof(result); if (r2 == ResultState.Bottom) yield return nameof(next); } } if (result.IsFailure) { error += result.Error; } if (next.IsFailure) { error += next.Error; } return error is null ? new(null) : new(error); } #endregion #region [Pure] public static Result Append(this in Result result, T value) { return result.State switch { ResultState.Success => value, ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static Result Append(this in Result result, Result next) { Error? error = null; if ((result.State & next.State) == ResultState.Bottom) { throw new ResultNotInitializedException(string.Join(';', GetBottom(result.State, next.State))); static IEnumerable GetBottom(ResultState r1, ResultState r2) { if (r1 == ResultState.Bottom) yield return nameof(result); if (r2 == ResultState.Bottom) yield return nameof(next); } } if (result.IsFailure) { error += result.Error; } if (next.IsFailure) { error += next.Error; } return error is null ? new(next.Value) : new(error); } [Pure] public static Result Append(this in Result result, Result next) { Error? error = null; if ((result.State & next.State) == ResultState.Bottom) { throw new ResultNotInitializedException(string.Join(';', GetBottom(result.State, next.State))); static IEnumerable GetBottom(ResultState r1, ResultState r2) { if (r1 == ResultState.Bottom) yield return nameof(result); if (r2 == ResultState.Bottom) yield return nameof(next); } } if (result.IsFailure) { error += result.Error; } if (next.IsFailure) { error += next.Error; } return error is null ? new(result.Value) : new(error); } [Pure] public static Result Append(this in Result result, Func> next) { return result.State switch { ResultState.Success => next(), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static Task> Append(this in Result result, Func>> next) { return result.State switch { ResultState.Success => next(), ResultState.Error => Task.FromResult>(result.Error!), _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static async Task> Append(this Task resultTask, Func>> next) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => await next().ConfigureAwait(false), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } [Pure] public static async Task> Append(this Task resultTask, Func> next) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => next(), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } #endregion #region [Pure] public static Result<(T1, T2)> Append(this in Result result, T2 value) { return result.State switch { ResultState.Success => (result.Value, value), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static Result<(T1, T2)> Append(this in Result result, Result next) { Error? error = null; if ((result.State & next.State) == ResultState.Bottom) { throw new ResultNotInitializedException(string.Join(';', GetBottom(result.State, next.State))); static IEnumerable GetBottom(ResultState r1, ResultState r2) { if (r1 == ResultState.Bottom) yield return nameof(result); if (r2 == ResultState.Bottom) yield return nameof(next); } } if (result.IsFailure) { error += result.Error; } if (next.IsFailure) { error += next.Error; } return error is null ? new((result.Value, next.Value)) : new(error); } [Pure] public static Result<(T1, T2)> Append(this in Result<(T1, T2)> result, Result next) { Error? error = null; if ((result.State & next.State) == ResultState.Bottom) { throw new ResultNotInitializedException(string.Join(';', GetBottom(result.State, next.State))); static IEnumerable GetBottom(ResultState r1, ResultState r2) { if (r1 == ResultState.Bottom) yield return nameof(result); if (r2 == ResultState.Bottom) yield return nameof(next); } } if (result.IsFailure) { error += result.Error; } if (next.IsFailure) { error += next.Error; } return error is null ? new(result.Value) : new(error); } [Pure] public static Result<(T1, T2)> Append(this in Result result, Func> next) { return result.State switch { ResultState.Success => result.Append(next()), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static async Task> Append(this Result result, Func>> next) { return result.State switch { ResultState.Success => result.Append(await next().ConfigureAwait(false)), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static async Task> Append(this Task> resultTask, Func>> next) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => result.Append(await next().ConfigureAwait(false)), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } [Pure] public static async Task> Append(this Task> resultTask, Func> next) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => result.Append(next()), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } #endregion #region [Pure] public static Result<(T1, T2, T3)> Append(this in Result<(T1, T2)> result, T3 value) { return result.State switch { ResultState.Success => (result.Value.Item1, result.Value.Item2, value), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static Result<(T1, T2, T3)> Append(this in Result<(T1, T2)> result, Result next) { Error? error = null; if ((result.State & next.State) == ResultState.Bottom) { throw new ResultNotInitializedException(string.Join(';', GetBottom(result.State, next.State))); static IEnumerable GetBottom(ResultState r1, ResultState r2) { if (r1 == ResultState.Bottom) yield return nameof(result); if (r2 == ResultState.Bottom) yield return nameof(next); } } if (result.IsFailure) { error += result.Error; } if (next.IsFailure) { error += next.Error; } return error is null ? new((result.Value.Item1, result.Value.Item2, next.Value)) : new(error); } [Pure] public static Result<(T1, T2, T3)> Append(this in Result<(T1, T2, T3)> result, Result next) { Error? error = null; if ((result.State & next.State) == ResultState.Bottom) { throw new ResultNotInitializedException(string.Join(';', GetBottom(result.State, next.State))); static IEnumerable GetBottom(ResultState r1, ResultState r2) { if (r1 == ResultState.Bottom) yield return nameof(result); if (r2 == ResultState.Bottom) yield return nameof(next); } } if (result.IsFailure) { error += result.Error; } if (next.IsFailure) { error += next.Error; } return error is null ? new(result.Value) : new(error); } [Pure] public static Result<(T1, T2, T3)> Append(this in Result<(T1, T2)> result, Func> next) { return result.State switch { ResultState.Success => result.Append(next()), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static async Task> Append(this Result<(T1, T2)> result, Func>> next) { return result.State switch { ResultState.Success => result.Append(await next().ConfigureAwait(false)), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static async Task> Append(this Task> resultTask, Func>> next) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => result.Append(await next().ConfigureAwait(false)), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } [Pure] public static async Task> Append(this Task> resultTask, Func> next) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => result.Append(next()), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } #endregion #region [Pure] public static Result<(T1, T2, T3, T4)> Append(this in Result<(T1, T2, T3)> result, T4 value) { return result.State switch { ResultState.Success => (result.Value.Item1, result.Value.Item2, result.Value.Item3, value), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static Result<(T1, T2, T3, T4)> Append(this in Result<(T1, T2, T3)> result, Result next) { Error? error = null; if ((result.State & next.State) == ResultState.Bottom) { throw new ResultNotInitializedException(string.Join(';', GetBottom(result.State, next.State))); static IEnumerable GetBottom(ResultState r1, ResultState r2) { if (r1 == ResultState.Bottom) yield return nameof(result); if (r2 == ResultState.Bottom) yield return nameof(next); } } if (result.IsFailure) { error += result.Error; } if (next.IsFailure) { error += next.Error; } return error is null ? new((result.Value.Item1, result.Value.Item2, result.Value.Item3, next.Value)) : new(error); } [Pure] public static Result<(T1, T2, T3, T4)> Append(this in Result<(T1, T2, T3, T4)> result, Result next) { Error? error = null; if ((result.State & next.State) == ResultState.Bottom) { throw new ResultNotInitializedException(string.Join(';', GetBottom(result.State, next.State))); static IEnumerable GetBottom(ResultState r1, ResultState r2) { if (r1 == ResultState.Bottom) yield return nameof(result); if (r2 == ResultState.Bottom) yield return nameof(next); } } if (result.IsFailure) { error += result.Error; } if (next.IsFailure) { error += next.Error; } return error is null ? new(result.Value) : new(error); } [Pure] public static Result<(T1, T2, T3, T4)> Append(this in Result<(T1, T2, T3)> result, Func> next) { return result.State switch { ResultState.Success => result.Append(next()), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static async Task> Append(this Result<(T1, T2, T3)> result, Func>> next) { return result.State switch { ResultState.Success => result.Append(await next().ConfigureAwait(false)), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(result)) }; } [Pure] public static async Task> Append(this Task> resultTask, Func>> next) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => result.Append(await next().ConfigureAwait(false)), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } [Pure] public static async Task> Append(this Task> resultTask, Func> next) { var result = await resultTask.ConfigureAwait(false); return result.State switch { ResultState.Success => result.Append(next()), ResultState.Error => result.Error!, _ => throw new ResultNotInitializedException(nameof(resultTask)) }; } #endregion #endregion #region Tap [Pure] public static ref readonly Result Tap(this in Result result, Action? onSuccess = null, Action? onFailure = null) { switch (result.State) { case ResultState.Success: onSuccess?.Invoke(); break; case ResultState.Error: onFailure?.Invoke(result.Error!); break; default: throw new ResultNotInitializedException(nameof(result)); } return ref result; } [Pure] public static async Task Tap(this Task resultTask, Action? onSuccess = null, Action? onFailure = null) { var result = await resultTask.ConfigureAwait(false); switch (result.State) { case ResultState.Success: onSuccess?.Invoke(); break; case ResultState.Error: onFailure?.Invoke(result.Error!); break; default: throw new ResultNotInitializedException(nameof(resultTask)); } return result; } [Pure] public static async Task Tap(this Result result, Func? onSuccess = null, Func? onFailure = null) { switch (result.State) { case ResultState.Success: if (onSuccess is not null) await onSuccess.Invoke().ConfigureAwait(false); break; case ResultState.Error: if (onFailure is not null) await onFailure.Invoke(result.Error!).ConfigureAwait(false); break; default: throw new ResultNotInitializedException(nameof(result)); } return result; } [Pure] public static async Task Tap(this Task resultTask, Func? onSuccess = null, Func? onFailure = null) { var result = await resultTask.ConfigureAwait(false); switch (result.State) { case ResultState.Success: if (onSuccess is not null) await onSuccess.Invoke().ConfigureAwait(false); break; case ResultState.Error: if (onFailure is not null) await onFailure.Invoke(result.Error!).ConfigureAwait(false); break; default: throw new ResultNotInitializedException(nameof(resultTask)); } return result; } [Pure] public static ref readonly Result Tap(this in Result result, Action? onSuccess = null, Action? onFailure = null) { switch (result.State) { case ResultState.Success: onSuccess?.Invoke(result.Value!); break; case ResultState.Error: onFailure?.Invoke(result.Error!); break; default: throw new ResultNotInitializedException(nameof(result)); } return ref result; } [Pure] public static async Task> Tap(this Task> resultTask, Action? onSuccess = null, Action? onFailure = null) { var result = await resultTask.ConfigureAwait(false); switch (result.State) { case ResultState.Success: onSuccess?.Invoke(result.Value!); break; case ResultState.Error: onFailure?.Invoke(result.Error!); break; default: throw new ResultNotInitializedException(nameof(resultTask)); } return result; } [Pure] public static async Task> Tap(this Result result, Func? onSuccess = null, Func? onFailure = null) { switch (result.State) { case ResultState.Success: if (onSuccess is not null) await onSuccess.Invoke(result.Value!).ConfigureAwait(false); break; case ResultState.Error: if (onFailure is not null) await onFailure.Invoke(result.Error!).ConfigureAwait(false); break; default: throw new ResultNotInitializedException(nameof(result)); } return result; } [Pure] public static async Task> Tap(this Task> resultTask, Func? onSuccess = null, Func? onFailure = null) { var result = await resultTask.ConfigureAwait(false); switch (result.State) { case ResultState.Success: if (onSuccess is not null) await onSuccess.Invoke(result.Value!).ConfigureAwait(false); break; case ResultState.Error: if (onFailure is not null) await onFailure.Invoke(result.Error!).ConfigureAwait(false); break; default: throw new ResultNotInitializedException(nameof(resultTask)); } return result; } [Pure] public static ref readonly Result<(T1, T2)> Tap(this in Result<(T1, T2)> result, Action? onSuccess = null, Action? onFailure = null) { switch (result.State) { case ResultState.Success: onSuccess?.Invoke(result.Value.Item1, result.Value.Item2); break; case ResultState.Error: onFailure?.Invoke(result.Error!); break; default: throw new ResultNotInitializedException(nameof(result)); } return ref result; } [Pure] public static async Task> Tap(this Task> resultTask, Action? onSuccess = null, Action? onFailure = null) { var result = await resultTask.ConfigureAwait(false); switch (result.State) { case ResultState.Success: onSuccess?.Invoke(result.Value.Item1, result.Value.Item2); break; case ResultState.Error: onFailure?.Invoke(result.Error!); break; default: throw new ResultNotInitializedException(nameof(resultTask)); } return result; } [Pure] public static async Task> Tap(this Result<(T1, T2)> result, Func? onSuccess = null, Func? onFailure = null) { switch (result.State) { case ResultState.Success: if (onSuccess is not null) await onSuccess.Invoke(result.Value.Item1, result.Value.Item2).ConfigureAwait(false); break; case ResultState.Error: if (onFailure is not null) await onFailure.Invoke(result.Error!).ConfigureAwait(false); break; default: throw new ResultNotInitializedException(nameof(result)); } return result; } [Pure] public static async Task> Tap(this Task> resultTask, Func? onSuccess = null, Func? onFailure = null) { var result = await resultTask.ConfigureAwait(false); switch (result.State) { case ResultState.Success: if (onSuccess is not null) await onSuccess.Invoke(result.Value.Item1, result.Value.Item2).ConfigureAwait(false); break; case ResultState.Error: if (onFailure is not null) await onFailure.Invoke(result.Error!).ConfigureAwait(false); break; default: throw new ResultNotInitializedException(nameof(resultTask)); } return result; } [Pure] public static ref readonly Result<(T1, T2, T3)> Tap(this in Result<(T1, T2, T3)> result, Action? onSuccess = null, Action? onFailure = null) { switch (result.State) { case ResultState.Success: onSuccess?.Invoke(result.Value.Item1, result.Value.Item2, result.Value.Item3); break; case ResultState.Error: onFailure?.Invoke(result.Error!); break; default: throw new ResultNotInitializedException(nameof(result)); } return ref result; } [Pure] public static async Task> Tap(this Task> resultTask, Action? onSuccess = null, Action? onFailure = null) { var result = await resultTask.ConfigureAwait(false); switch (result.State) { case ResultState.Success: onSuccess?.Invoke(result.Value.Item1, result.Value.Item2, result.Value.Item3); break; case ResultState.Error: onFailure?.Invoke(result.Error!); break; default: throw new ResultNotInitializedException(nameof(resultTask)); } return result; } [Pure] public static async Task> Tap(this Result<(T1, T2, T3)> result, Func? onSuccess = null, Func? onFailure = null) { switch (result.State) { case ResultState.Success: if (onSuccess is not null) await onSuccess.Invoke(result.Value.Item1, result.Value.Item2, result.Value.Item3).ConfigureAwait(false); break; case ResultState.Error: if (onFailure is not null) await onFailure.Invoke(result.Error!).ConfigureAwait(false); break; default: throw new ResultNotInitializedException(nameof(result)); } return result; } [Pure] public static async Task> Tap(this Task> resultTask, Func? onSuccess = null, Func? onFailure = null) { var result = await resultTask.ConfigureAwait(false); switch (result.State) { case ResultState.Success: if (onSuccess is not null) await onSuccess.Invoke(result.Value.Item1, result.Value.Item2, result.Value.Item3).ConfigureAwait(false); break; case ResultState.Error: if (onFailure is not null) await onFailure.Invoke(result.Error!).ConfigureAwait(false); break; default: throw new ResultNotInitializedException(nameof(resultTask)); } return result; } [Pure] public static ref readonly Result<(T1, T2, T3, T4)> Tap(this in Result<(T1, T2, T3, T4)> result, Action? onSuccess = null, Action? onFailure = null) { switch (result.State) { case ResultState.Success: onSuccess?.Invoke(result.Value.Item1, result.Value.Item2, result.Value.Item3, result.Value.Item4); break; case ResultState.Error: onFailure?.Invoke(result.Error!); break; default: throw new ResultNotInitializedException(nameof(result)); } return ref result; } [Pure] public static async Task> Tap(this Task> resultTask, Action? onSuccess = null, Action? onFailure = null) { var result = await resultTask.ConfigureAwait(false); switch (result.State) { case ResultState.Success: onSuccess?.Invoke(result.Value.Item1, result.Value.Item2, result.Value.Item3, result.Value.Item4); break; case ResultState.Error: onFailure?.Invoke(result.Error!); break; default: throw new ResultNotInitializedException(nameof(resultTask)); } return result; } [Pure] public static async Task> Tap(this Result<(T1, T2, T3, T4)> result, Func? onSuccess = null, Func? onFailure = null) { switch (result.State) { case ResultState.Success: if (onSuccess is not null) await onSuccess.Invoke(result.Value.Item1, result.Value.Item2, result.Value.Item3, result.Value.Item4).ConfigureAwait(false); break; case ResultState.Error: if (onFailure is not null) await onFailure.Invoke(result.Error!).ConfigureAwait(false); break; default: throw new ResultNotInitializedException(nameof(result)); } return result; } [Pure] public static async Task> Tap(this Task> resultTask, Func? onSuccess = null, Func? onFailure = null) { var result = await resultTask.ConfigureAwait(false); switch (result.State) { case ResultState.Success: if (onSuccess is not null) await onSuccess.Invoke(result.Value.Item1, result.Value.Item2, result.Value.Item3, result.Value.Item4).ConfigureAwait(false); break; case ResultState.Error: if (onFailure is not null) await onFailure.Invoke(result.Error!).ConfigureAwait(false); break; default: throw new ResultNotInitializedException(nameof(resultTask)); } return result; } #endregion #region Merge public static Result> Merge(this IEnumerable> results) { List? values = null; List? errors = null; bool hasErrors = false; foreach (var result in results.OrderBy(x => x.State)) { switch (result.State) { case ResultState.Error: hasErrors = true; errors ??= []; errors.Add(result.Error!); break; case ResultState.Success: if (hasErrors) goto afterLoop; values ??= []; values.Add(result.Value); break; default: throw new ResultNotInitializedException(nameof(results)); } } afterLoop: return hasErrors ? new(new ManyErrors(errors!)) : new((IEnumerable?)values ?? Array.Empty()); } public static async Task>> Merge(this IEnumerable>> tasks) { var results = await Task.WhenAll(tasks).ConfigureAwait(false); return results.Merge(); } #endregion }