using System.Collections; using Core.Helpers; using Core.SpecConfig; namespace Core; public class ProcessEnumerator : IEnumerator { private int _languagePosition; private int _typePosition; private readonly List _enumerable; object IEnumerator.Current => Current; public ProcessTask Current { get { return _enumerable.First(pt => (int)pt.GenerationType == _typePosition && (int)pt.Language == _languagePosition); } } public ProcessEnumerator(List current) { _languagePosition = -1; _typePosition = -1; _enumerable = current; } public bool MoveNext() { if (_typePosition == -1 && _languagePosition == -1) { _typePosition += 1; _languagePosition += 1; } else if (PassedTypeBoundaries()) { _typePosition = 0; _languagePosition += 1; } else { _typePosition += 1; } if (!HasElement() && !PassedMaxPosition()) { MoveNext(); } return !PassedMaxPosition(); } public void Reset() { _languagePosition = -1; _typePosition = -1; } private bool PassedLanguageBoundaries() => _languagePosition >= EnumHelper.GetMaxValue() - 1; private bool PassedTypeBoundaries() => _typePosition >= EnumHelper.GetMaxValue() - 1; private bool PassedMaxPosition() => PassedLanguageBoundaries() && PassedTypeBoundaries(); private bool HasElement() { var e= _enumerable.FirstOrDefault(pt => (int)pt.GenerationType == _typePosition && (int)pt.Language == _languagePosition); return e != null; } }