throttle static method

TileUpdateTransformer throttle(
  1. Duration duration
)

Throttle loading/updating/pruning tiles such that it only occurs once per duration

Ignores events where it is one of:

It is assumed (/guaranteed) that these events should not cause the map to move, and therefore, tile changes are not required.

Implementation

static TileUpdateTransformer throttle(Duration duration) {
  Timer? timer;
  TileUpdateEvent recentEvent;
  var trailingCall = false;

  void throttleHandler(
    TileUpdateEvent event,
    EventSink<TileUpdateEvent> sink,
  ) {
    if (wasTriggeredByTap(event)) return;

    recentEvent = event;

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

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

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