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 != 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 == null ? _llist.First : _currentNode.Next; return _currentNode != null; } public void Reset() { throw new NotImplementedException(); } public LinkedListNode Current => _currentNode!; object IEnumerator.Current => Current; public void Dispose() { } }