using System.Collections.Generic; namespace Code.Infrastructure.EventBus { internal class SubscribersList where TSubscriber : class { private bool m_NeedsCleanUp; public bool Executing; public readonly List List = new(); // TODO Weakptr public void Add(TSubscriber subscriber) { List.Add(subscriber); } public void Remove(TSubscriber subscriber) { if (Executing) { var i = List.IndexOf(subscriber); if (i >= 0) { m_NeedsCleanUp = true; List[i] = null; } } else { List.Remove(subscriber); } } public void Cleanup() { if (!m_NeedsCleanUp) { return; } List.RemoveAll(s => s == null); m_NeedsCleanUp = false; } } }