combineResolvable<T extends Object> function

Resolvable<List<T>> combineResolvable<T extends Object>(
  1. Iterable<Resolvable<T>> resolvables, {
  2. @noFutures Err<List<T>> onErr(
    1. List<Result<T>> allResults
    )?,
})

Combines an iterable of Resolvables into one containing a list of their values.

The result is an Async if any of the resolvables are Async If any resolvable contains an Err, applies onErr to combine errors.

Implementation

Resolvable<List<T>> combineResolvable<T extends Object>(
  Iterable<Resolvable<T>> resolvables, {
  @noFutures Err<List<T>> Function(List<Result<T>> allResults)? onErr,
}) {
  if (resolvables.isEmpty) {
    return Sync.okValue([]);
  }

  // If any resolvable is async, the result must be async.
  if (resolvables.any((r) => r.isAsync())) {
    final asyncs = resolvables.map((r) => r.toAsync());
    return combineAsync(asyncs, onErr: onErr);
  } else {
    // All are sync, so we can proceed synchronously.
    final syncs = resolvables.map((r) => r as Sync<T>);
    return combineSync(syncs, onErr: onErr);
  }
}