using System; using System.Collections.Generic; using System.Linq; using System.Threading; namespace Kruzya.TelegramBot.Core.Cache { public class MemoryCache : ICacheStorage { /// /// Represents a cache entry in internal dictionary. /// /// internal struct CacheEntry { public TVal Value; public DateTime Created; public int ExpiresAt; public bool IsExpired() { if (ExpiresAt == Timeout.Infinite) { return false; } return (Created.AddSeconds(ExpiresAt)) < DateTime.Now; } } /// /// /// private Dictionary> dict = new Dictionary>(); /// /// The TTL for all entries if not set. /// private int _defaultTtl; public MemoryCache() : this(Timeout.Infinite) { } public MemoryCache(int defaultTtl) { _defaultTtl = defaultTtl; } public bool TryGetValue(TKey key, ref TValue value) { if (dict.ContainsKey(key)) { return false; } CacheEntry temp; if (!dict.TryGetValue(key, out temp)) { return false; } if (temp.IsExpired()) { dict.Remove(key); return false; } value = temp.Value; return true; } public void SetValue(TKey key, TValue value) { SetValue(key, value, _defaultTtl); } public void SetValue(TKey key, TValue value, int timeToLive) { if (dict.ContainsKey(key)) { dict.Remove(key); } dict.Add(key, new CacheEntry() { Created = DateTime.Now, ExpiresAt = timeToLive, Value = value }); } } }