import 'memory_cache_store.dart'; import 'persistent_cache_store.dart'; class HybridCacheStore { final MemoryCacheStore memory; final PersistentCacheStore persistent; final Map> _inflight = >{}; HybridCacheStore({required this.memory, required this.persistent}); Future read(String key) async { final memoryValue = await memory.read(key); if (memoryValue != null) { return memoryValue; } final persistentValue = await persistent.read(key); if (persistentValue != null) { await memory.write(key, persistentValue); } return persistentValue; } Future write(String key, T value) async { await memory.write(key, value); await persistent.write(key, value); } Future remove(String key) async { await memory.remove(key); await persistent.remove(key); } Future getOrLoad(String key, {required Future Function() loader}) { final running = _inflight[key]; if (running != null) { return running.then((value) => value as T); } final future = () async { final cached = await read(key); if (cached != null) { return cached; } final loaded = await loader(); await write(key, loaded); return loaded; }(); _inflight[key] = future; return future.whenComplete(() { _inflight.remove(key); }); } }