using System.Collections;
namespace ParadoxSaveParser.Lib;
///
/// Enumerator wrapper that stores N/2 items before and N/2-1 after Current item.
///
///
/// IEnumerator<int> Enumerator()
/// {
/// for(int i = 0; i < 6; i++)
/// yield return i;
/// }
///
/// var en = Enumerator();
/// var bufen = new BufferedEnumerator<int>(en, 5);
///
/// while(bufen.MoveNext())
/// {
/// var cur = bufen.Current;
/// for (var prev = cur.List?.First; prev != cur; prev = prev?.Next)
/// Console.Write($"{prev?.Value} ");
///
/// Console.Write($"| {cur.Value} |");
///
/// for (var next = cur.Next; next is not null; next = next.Next)
/// Console.Write($" {next.Value}");
/// Console.WriteLine();
/// }
///
/// Output:
///
/// | 0 | 1 2 3 4
/// 0 | 1 | 2 3 4
/// 0 1 | 2 | 3 4
/// 1 2 | 3 | 4 5
/// 2 3 | 4 | 5
/// 3 4 | 5 |
///
public class BufferedEnumerator : IEnumerator>
{
private IEnumerator _enumerator;
private int _bufferSize;
LinkedList _llist = new();
private LinkedListNode? _currentNode;
private int _currentNodeIndex = -1;
public BufferedEnumerator(IEnumerator enumerator, int bufferSize)
{
_enumerator = enumerator;
_bufferSize = bufferSize;
}
public bool MoveNext()
{
if(_currentNodeIndex >= _bufferSize / 2)
_llist.RemoveFirst();
while (_llist.Count < _bufferSize && _enumerator.MoveNext())
{
_llist.AddLast(_enumerator.Current);
}
if (_llist.Count == 0)
return false;
_currentNodeIndex++;
_currentNode = _currentNode is null ? _llist.First : _currentNode.Next;
return _currentNode is not null;
}
public void Reset()
{
throw new NotImplementedException();
}
public LinkedListNode Current => _currentNode!;
object IEnumerator.Current => Current;
public void Dispose()
{
}
}