public async Task <ICacheEntry <T> > HitOrUpdateAsync(ulong id, Func <ulong, Task <IEntry <T> > > updater)
        {
            if (await _storage.HasAsync(id))
            {
                var cached = await _storage.RestoreAsync(id);

                if (cached.CachedAt + _timeout > DateTimeOffset.Now)
                {
                    return(cached);
                }
            }

            var entry = _entryFactory.Create((await updater(id)).Item);
            await _storage.StoreAsync(entry);

            return(entry);
        }