throttleStreamTransformerWithTrailingCall<T> function

StreamTransformer<T, T> throttleStreamTransformerWithTrailingCall<T>(
  1. Duration duration, {
  2. bool ignore(
    1. T
    )?,
})

Implementation

StreamTransformer<T, T> throttleStreamTransformerWithTrailingCall<T>(
  Duration duration, {
  bool Function(T)? ignore,
}) {
  Timer? timer;
  T recentData;
  var trailingCall = false;

  late final void Function(T data, EventSink<T> sink) throttleHandler;

  throttleHandler = (T data, EventSink<T> sink) {
    if (ignore?.call(data) == true) return;

    recentData = data;

    if (timer == null) {
      sink.add(recentData);
      timer = Timer(duration, () {
        timer = null;

        if (trailingCall) {
          trailingCall = false;
          throttleHandler(recentData, sink);
        }
      });
    } else {
      trailingCall = true;
    }
  };

  return StreamTransformer<T, T>.fromHandlers(
      handleData: throttleHandler,
      handleDone: (EventSink<T> sink) {
        timer?.cancel();
        sink.close();
      });
}