namespace Just.Railway; public static partial class ResultExtensions { #region Merge public static Result Merge(this IEnumerable results) { 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; break; default: throw new ResultNotInitializedException(nameof(results)); } } afterLoop: return hasErrors ? new(new ManyErrors(errors!)) : new(null); } public static async Task Merge(this IEnumerable> tasks) { var results = await Task.WhenAll(tasks).ConfigureAwait(false); return results.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 }