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