waitFor<T> static method

Future<T> waitFor<T>(
  1. Signal<T> signal,
  2. bool condition(
    1. T value
    ), {
  3. Duration? timeout,
})

Wait for a signal to meet a condition.

Implementation

static Future<T> waitFor<T>(
  Signal<T> signal,
  bool Function(T value) condition, {
  Duration? timeout,
}) async {
  if (condition(signal.val)) {
    return signal.val;
  }

  final completer = Completer<T>();
  StreamSubscription<T>? subscription;

  subscription = signal.stream.listen((value) {
    if (condition(value)) {
      subscription?.cancel();
      if (!completer.isCompleted) {
        completer.complete(value);
      }
    }
  });

  if (timeout != null) {
    return completer.future.timeout(timeout, onTimeout: () {
      subscription?.cancel();
      throw TimeoutException('Timeout waiting for signal condition');
    });
  }

  return completer.future;
}