refactor: extracted interface from pool and added events

This commit is contained in:
Syntriax 2025-06-09 18:19:32 +03:00
parent 62b54ee836
commit 3f914fe46f
2 changed files with 23 additions and 8 deletions

View File

@ -0,0 +1,10 @@
namespace Syntriax.Engine.Core;
public interface IPool<T>
{
Event<IPool<T>, T> OnRemoved { get; }
Event<IPool<T>, T> OnReturned { get; }
T Get();
void Return(T item);
}

View File

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