Salmon/Salmon.Core/Depth/EventManager.cs
2024-04-11 21:30:36 +02:00

64 lines
1.3 KiB
C#

using System.Diagnostics;
namespace Salmon.Core.Depth;
public class EventManager
{
public long MaxBufferedEvents { get; set; } = 2000;
Queue<string> _EventIds = new ();
Dictionary<string, Event> _LastEvents = new ();
object Mutex = new();
public EventManager()
{
}
void Trim()
{
List<string> 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<Event> GetLastEvents(int maxCount = 200)
{
return _LastEvents.Values.OrderByDescending(x => x.When).Take(maxCount).ToList();
}
}