Future<T> singleWhere(bool test(T element))

Finds the single element in this stream matching test.

Like lastMatch, except that it is an error if more than one matching element occurs in the stream.

Source

Future<T> singleWhere(bool test(T element)) {
  _Future<T> future = new _Future<T>();
  T result = null;
  bool foundResult = false;
  StreamSubscription subscription;
  subscription = this.listen(
    (T value) {
      _runUserCode(
        () => true == test(value),
        (bool isMatch) {
          if (isMatch) {
            if (foundResult) {
              try {
                throw IterableElementError.tooMany();
              } catch (e, s) {
                _cancelAndErrorWithReplacement(subscription, future, e, s);
              }
              return;
            }
            foundResult = true;
            result = value;
          }
        },
        _cancelAndErrorClosure(subscription, future)
      );
    },
    onError: future._completeError,
    onDone: () {
      if (foundResult) {
        future._complete(result);
        return;
      }
      try {
        throw IterableElementError.noElement();
      } catch (e, s) {
        _completeWithErrorCallback(future, e, s);
      }
    },
    cancelOnError: true);
  return future;
}