2023-08-03 16:17:34 -07:00
|
|
|
using Godot;
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
2023-08-17 01:05:21 -07:00
|
|
|
public class CacheStore<TKey, TVal> : IEnumerable<KeyValuePair<TKey, CacheItem<TVal>>>
|
2023-08-03 16:17:34 -07:00
|
|
|
{
|
2023-08-07 02:38:51 -07:00
|
|
|
// default TTL is 1 min
|
|
|
|
public ulong TimeToLive { get; } = 60000;
|
2023-08-03 16:17:34 -07:00
|
|
|
|
2023-08-17 01:05:21 -07:00
|
|
|
private readonly Dictionary<TKey, CacheItem<TVal>> _store = new();
|
2023-08-03 16:17:34 -07:00
|
|
|
|
|
|
|
public CacheItem<TVal> this[TKey key]
|
|
|
|
{
|
|
|
|
get
|
|
|
|
{
|
|
|
|
if (_store.ContainsKey(key))
|
|
|
|
{
|
|
|
|
return _store[key];
|
|
|
|
}
|
|
|
|
return null;
|
|
|
|
}
|
|
|
|
set
|
|
|
|
{
|
|
|
|
if (_store.ContainsKey(key))
|
|
|
|
{
|
|
|
|
_store[key] = value;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
_store.Add(key, value);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-08-17 01:05:21 -07:00
|
|
|
public IEnumerator<KeyValuePair<TKey, CacheItem<TVal>>> GetEnumerator()
|
|
|
|
{
|
|
|
|
return _store.GetEnumerator();
|
|
|
|
}
|
|
|
|
|
|
|
|
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
|
|
|
|
{
|
|
|
|
return this.GetEnumerator();
|
|
|
|
}
|
|
|
|
|
2023-08-03 16:17:34 -07:00
|
|
|
public TVal Retrieve(TKey key)
|
|
|
|
{
|
|
|
|
if (IsItemValid(key))
|
|
|
|
{
|
|
|
|
return _store[key].Value;
|
|
|
|
}
|
|
|
|
return default;
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Update(TKey key, TVal value = default)
|
|
|
|
{
|
|
|
|
CacheItem<TVal> cacheItem;
|
|
|
|
if (_store.ContainsKey(key))
|
|
|
|
{
|
|
|
|
cacheItem = _store[key];
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
cacheItem = new CacheItem<TVal>();
|
|
|
|
_store[key] = cacheItem;
|
|
|
|
}
|
|
|
|
cacheItem.TimeToLiveTimestamp = Time.GetTicksMsec();
|
|
|
|
cacheItem.Value = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool IsItemStale(TKey key)
|
|
|
|
{
|
|
|
|
if (_store.ContainsKey(key))
|
|
|
|
{
|
|
|
|
return _store[key].HasExpired(TimeToLive);
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
public bool IsItemValid(TKey key)
|
|
|
|
{
|
2023-08-15 11:27:03 -07:00
|
|
|
return key is not null && _store.ContainsKey(key) && !IsItemStale(key);
|
2023-08-03 16:17:34 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
public bool ContainsKey(TKey key)
|
|
|
|
{
|
|
|
|
return _store.ContainsKey(key);
|
|
|
|
}
|
|
|
|
|
|
|
|
public void Update(TKey key)
|
|
|
|
{
|
|
|
|
if (_store.ContainsKey(key))
|
|
|
|
{
|
|
|
|
_store[key].TimeToLiveTimestamp = Time.GetTicksMsec();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
GD.PushWarning("Updating a non-existent item in a cache!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|