interval<T> function

Worker interval<T>(
  1. GetListenable<T> listener,
  2. WorkerCallback<T> callback, {
  3. Duration time = const Duration(seconds: 1),
  4. dynamic condition = true,
  5. Function? onError,
  6. void onDone()?,
  7. bool? cancelOnError,
})

Ignore all changes in listener during time (1 sec by default) or until condition is met (can be a bool expression or a bool Function()), It brings the 1st "value" since the period of time, so if you click a counter button 3 times in 1 sec, it will show you "1" (after 1 sec of the first press) click counter 3 times in 1 sec, it will show you "4" (after 1 sec) click counter 2 times in 1 sec, it will show you "7" (after 1 sec).

Sample: // wait 1 sec each time an event starts, only if counter is lower than 20. worker = interval( count, (value) => print(value), time: 1.seconds, condition: () => count < 20, );

Implementation

Worker interval<T>(
  GetListenable<T> listener,
  WorkerCallback<T> callback, {
  Duration time = const Duration(seconds: 1),
  dynamic condition = true,
  Function? onError,
  void Function()? onDone,
  bool? cancelOnError,
}) {
  var debounceActive = false;
  StreamSubscription sub = listener.listen(
    (event) async {
      if (debounceActive || !_conditional(condition)) return;
      debounceActive = true;
      await Future.delayed(time);
      debounceActive = false;
      callback(event);
    },
    onError: onError,
    onDone: onDone,
    cancelOnError: cancelOnError,
  );
  return Worker(sub.cancel, '[interval]');
}