using System; using System.Collections.Generic; namespace Syntriax.Engine.Core; public class Pool : IPool { public Event, T> OnRemoved { get; } = new(); public Event, T> OnReturned { get; } = new(); private readonly Func generator = null!; private readonly Queue queue = new(); public T Get() { if (!queue.TryDequeue(out T? result)) result = generator(); OnRemoved?.Invoke(this, result); return result; } public void Return(T item) { if (queue.Contains(item)) return; queue.Enqueue(item); OnReturned?.Invoke(this, item); } public Pool(Func generator, int initialCapacity = 1) { this.generator = generator; for (int i = 0; i < initialCapacity; i++) queue.Enqueue(generator()); } }