static CancelableOperation race()

in lib/src/cancelable_operation.dart [68:96]


  static CancelableOperation<T> race<T>(
      Iterable<CancelableOperation<T>> operations) {
    operations = operations.toList();
    if (operations.isEmpty) {
      throw ArgumentError("May not be empty", "operations");
    }

    var done = false;
    // Note: if one of the completers has already completed, it's not actually
    // cancelled by this.
    Future<void> _cancelAll() {
      done = true;
      return Future.wait(operations.map((operation) => operation.cancel()));
    }

    var completer = CancelableCompleter<T>(onCancel: _cancelAll);
    for (var operation in operations) {
      operation.then((value) {
        if (!done) completer.complete(_cancelAll().then((_) => value));
      }, onError: (error, stackTrace) {
        if (!done) {
          completer.complete(
              _cancelAll().then((_) => Future.error(error, stackTrace)));
        }
      });
    }

    return completer.operation;
  }