56 lines
1.0 KiB
C#
56 lines
1.0 KiB
C#
|
|
using System.Collections.Generic;
|
|
|
|
using Rokojori.Extensions;
|
|
namespace Rokojori
|
|
{
|
|
public class QueueList<T>
|
|
{
|
|
List<T> _data = new List<T>();
|
|
List<T> _queuedInsertions = new List<T>();
|
|
List<T> _queuedRemovals = new List<T>();
|
|
|
|
public void QueueInsert( T t )
|
|
{
|
|
_queuedInsertions.Add( t );
|
|
}
|
|
|
|
public void QueueRemoval( T t )
|
|
{
|
|
_queuedRemovals.Add( t );
|
|
}
|
|
|
|
public void IterateAndResolve( System.Action<T> callback )
|
|
{
|
|
ResolveRemovalsQueue();
|
|
ResolveInsertionQueue();
|
|
|
|
_data.ForEach( t => callback( t ) );
|
|
|
|
ResolveRemovalsQueue();
|
|
}
|
|
|
|
protected void ResolveInsertionQueue()
|
|
{
|
|
if ( _queuedInsertions.Count == 0 )
|
|
{
|
|
return;
|
|
}
|
|
|
|
_data.AddRange( _queuedInsertions );
|
|
_queuedInsertions.Clear();
|
|
}
|
|
|
|
protected void ResolveRemovalsQueue()
|
|
{
|
|
if ( _queuedRemovals.Count == 0 )
|
|
{
|
|
return;
|
|
}
|
|
|
|
ListExtensions.RemoveList( _data, _queuedRemovals );
|
|
_queuedRemovals.Clear();
|
|
}
|
|
|
|
}
|
|
} |