using System.Collections; namespace PkmnLib.Dynamic.ScriptHandling; /// /// Iterator to figure out the scripts to run. /// public class ScriptIterator : IEnumerable { private readonly IReadOnlyList> _scripts; private int _currentIndex = 0; /// public ScriptIterator(IReadOnlyList> scripts) { _scripts = scripts; } /// public IEnumerator GetEnumerator() { while (_currentIndex < _scripts.Count) { var enumerable = _scripts[_currentIndex++]; switch (enumerable) { case IScriptSet set: { // We can't assume that the set remains the same size, so we need to iterate through it // with a for loop. for (var j = 0; j < set.Count; j++) { var script = set.At(j); // We can ignore empty scripts. if (script.IsEmpty) continue; yield return script; } break; } case ScriptContainer { IsEmpty: true }: continue; case ScriptContainer container: yield return container; break; default: throw new InvalidOperationException( $"Unexpected script type: {enumerable.GetType().Name}. Expected IScriptSet or ScriptContainer."); } } _currentIndex = 0; } /// IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); }