deduplicate<T> static method
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;
}