throttleStreamTransformerWithTrailingCall<T> function

StreamTransformer<T, T> throttleStreamTransformerWithTrailingCall<T>(
  1. Duration? duration
)

Implementation

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

  late void Function(T data, EventSink<T> sink) throttleHandler;
  throttleHandler = (T data, EventSink<T> sink) {
    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();
      });
}