using System.Diagnostics; namespace Salmon.Core.Depth; public class EventManager { public long MaxBufferedEvents { get; set; } = 2000; Queue _EventIds = new (); Dictionary _LastEvents = new (); object Mutex = new(); public EventManager() { } void Trim() { List toDelete = new(); lock(Mutex) while(_LastEvents.Count > MaxBufferedEvents) _LastEvents.Remove(_EventIds.Dequeue()); } void Set(Event e) { ArgumentNullException.ThrowIfNull(e, "e"); lock (Mutex) { Debug.Assert(_LastEvents.ContainsKey(e.UniqueId)); _LastEvents[e.UniqueId] = e; } } void Add(Event e) { ArgumentNullException.ThrowIfNull (e, "e"); lock (Mutex) { Debug.Assert(!_LastEvents.ContainsKey(e.UniqueId)); _EventIds.Enqueue(e.UniqueId); _LastEvents.Add(e.UniqueId, e); } Trim(); } public void Push(Event e) { ArgumentNullException.ThrowIfNull(e, "e"); Add(e); } public IEnumerable GetLastEvents(int maxCount = 200) { return _LastEvents.Values.OrderByDescending(x => x.When).Take(maxCount).ToList(); } }