39 lines
873 B
C#
39 lines
873 B
C#
using System;
|
|
using System.Collections.Generic;
|
|
|
|
namespace Syntriax.Engine.Core;
|
|
|
|
public class Pool<T> : IPool<T>
|
|
{
|
|
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();
|
|
|
|
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<T> generator, int initialCapacity = 1)
|
|
{
|
|
this.generator = generator;
|
|
for (int i = 0; i < initialCapacity; i++)
|
|
queue.Enqueue(generator());
|
|
}
|
|
}
|