deduplicate<T> method

Future<T> deduplicate<T>(
  1. List key,
  2. Future<T> fetcher()
)

Deduplicates concurrent requests sharing key within this scope only.

Implementation

Future<T> deduplicate<T>(List<dynamic> key, Future<T> Function() fetcher) {
  _assertAlive();
  final keyStr = BloomData.normalizeKey(key);
  if (_inFlightRequests.containsKey(keyStr)) {
    return _inFlightRequests[keyStr]!.future as Future<T>;
  }

  final completer = Completer<T>();
  _inFlightRequests[keyStr] = completer;

  fetcher().then((val) {
    _inFlightRequests.remove(keyStr);
    if (!completer.isCompleted) completer.complete(val);
  }).catchError((Object err, StackTrace st) {
    _inFlightRequests.remove(keyStr);
    if (!completer.isCompleted) completer.completeError(err, st);
  });

  return completer.future;
}