class CacheDecision { final bool canUseCached; final bool shouldRefreshInBackground; final bool mustBlockForNetwork; const CacheDecision({ required this.canUseCached, required this.shouldRefreshInBackground, required this.mustBlockForNetwork, }); } class CachePolicy { final Duration softTtl; final Duration hardTtl; final Duration minRefreshInterval; const CachePolicy({ required this.softTtl, required this.hardTtl, this.minRefreshInterval = Duration.zero, }); CacheDecision evaluate({required DateTime now, required DateTime fetchedAt}) { final age = now.difference(fetchedAt); if (age >= hardTtl) { return const CacheDecision( canUseCached: false, shouldRefreshInBackground: false, mustBlockForNetwork: true, ); } if (age >= softTtl) { final shouldRefresh = age >= minRefreshInterval; return CacheDecision( canUseCached: true, shouldRefreshInBackground: shouldRefresh, mustBlockForNetwork: false, ); } return const CacheDecision( canUseCached: true, shouldRefreshInBackground: false, mustBlockForNetwork: false, ); } }