createTimerStream function

Stream<DateTime> createTimerStream(
  1. TimerGenerator generator,
  2. Future stopSignal
)

Creates a stream tha produces DateTime objects at the times specified by the generator. Stops the stream when stopSignal is received.

Implementation

Stream<DateTime> createTimerStream(
  TimerGenerator generator,
  Future stopSignal,
) async* {
  for (var now = DateTime.now(), next = generator(now);
      next != null;
      now = DateTime.now(), next = generator(now)) {
    if (now.compareTo(next) > 0) continue;
    Duration waitTime = next.difference(now);
    try {
      await stopSignal.timeout(waitTime);
      return;
    } on TimeoutException catch (_) {
      yield next;
    }
  }
}