deduplicate<T> static method

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

Request deduplication: ensures multiple concurrent fetches for the same key share a single Future.

Example:

final data = await BloomData.deduplicate(['items'], () => fetchItemsFromApi());

Implementation

static Future<T> deduplicate<T>(List<dynamic> key, Future<T> Function() fetcher) {
  final keyStr = 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);
    completer.complete(val);
  }).catchError((err, st) {
    _inFlightRequests.remove(keyStr);
    completer.completeError(err, st);
  });

  return completer.future;
}