throttleStreamTransformerWithTrailingCall<T> function
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();
});
}