diff --git a/Plugin/EnumerableExtensions/EnumerableExtensions.cs b/Plugin/EnumerableExtensions/EnumerableExtensions.cs index 0512bf7..455ed7c 100644 --- a/Plugin/EnumerableExtensions/EnumerableExtensions.cs +++ b/Plugin/EnumerableExtensions/EnumerableExtensions.cs @@ -45,44 +45,48 @@ public static IEnumerable Prepend(this IEnumerable sequence, T element) return new PrependIterator(sequence, element); } - private class AppendIterator : AppendPrependIterator + private sealed class AppendIterator : AppendPrependIterator { public AppendIterator(IEnumerable sequence, T element) : base(sequence, element) { } } - private class PrependIterator : AppendPrependIterator + private sealed class PrependIterator : AppendPrependIterator { public PrependIterator(IEnumerable sequence, T element) : base(sequence, element) { } } - private class AppendPrependIterator : IEnumerable + private abstract class AppendPrependIterator : IEnumerable { private readonly T element; private readonly IEnumerable sequence; - public AppendPrependIterator(IEnumerable sequence, T element) + protected AppendPrependIterator(IEnumerable sequence, T element) { + if (sequence == null) { throw new ArgumentNullException("sequence"); } this.element = element; this.sequence = sequence; } public IEnumerator GetEnumerator() { - var appends = new Stack>(); + var appends = new Stack>(); IEnumerable seq = this; - do + while (true) { - if (seq is PrependIterator) + var iterator = seq as AppendPrependIterator; + if (iterator == null) { break; } + + if (iterator is AppendIterator) { - yield return ((PrependIterator)seq).element; + appends.Push(iterator); } - else // (seq is AppendIterator) + else // (iterator is PrependIterator) { - appends.Push((AppendIterator)seq); + yield return iterator.element; } - seq = ((AppendPrependIterator)seq).sequence; - } while (seq is AppendPrependIterator); + seq = iterator.sequence; + } foreach (var e in seq) { yield return e; } while (appends.Count > 0) { yield return appends.Pop().element; }