using System; using System.Collections.Generic; using System.Linq; namespace Maki { internal abstract class BaseManager : IDisposable { protected readonly HashSet Collection = new HashSet(); public IEnumerable Items => Collection; public int Count => Collection.Count; public event Action OnAdd; public event Action OnRemove; protected virtual bool DisposeOnRemove => true; protected bool IsDisposed = false; ~BaseManager() => Dispose(false); public void Dispose() { Dispose(true); GC.SuppressFinalize(this); } protected void Dispose(bool disposing) { if (IsDisposed) return; IsDisposed = true; Collection.ToList().ForEach(x => Remove(x)); Collection.Clear(); } public virtual void Add(T item) { if (item == null) return; lock (Collection) Collection.Add(item); OnAdd?.Invoke(item); } public virtual void Remove(T item) { if (item == null) return; lock (Collection) Collection.Remove(item); OnRemove?.Invoke(item); if (DisposeOnRemove && item is IDisposable) (item as IDisposable).Dispose(); } } }