Skip to content

Commit

Permalink
Move Append/Prepend methods to own file
Browse files Browse the repository at this point in the history
  • Loading branch information
Majiir committed Sep 2, 2014
1 parent 812fd10 commit 62c4954
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 63 deletions.
71 changes: 71 additions & 0 deletions Plugin/EnumerableExtensions/AppendPrepend.cs
@@ -0,0 +1,71 @@
using System;
using System.Collections.Generic;

namespace Kethane.EnumerableExtensions
{
public static class AppendPrepend
{
public static IEnumerable<T> Append<T>(this IEnumerable<T> sequence, T element)
{
return new AppendIterator<T>(sequence, element);
}

public static IEnumerable<T> Prepend<T>(this IEnumerable<T> sequence, T element)
{
return new PrependIterator<T>(sequence, element);
}

private sealed class AppendIterator<T> : AppendPrependIterator<T>
{
public AppendIterator(IEnumerable<T> sequence, T element) : base(sequence, element) { }
}

private sealed class PrependIterator<T> : AppendPrependIterator<T>
{
public PrependIterator(IEnumerable<T> sequence, T element) : base(sequence, element) { }
}

private abstract class AppendPrependIterator<T> : IEnumerable<T>
{
private readonly T element;
private readonly IEnumerable<T> sequence;

protected AppendPrependIterator(IEnumerable<T> sequence, T element)
{
if (sequence == null) { throw new ArgumentNullException("sequence"); }
this.element = element;
this.sequence = sequence;
}

public IEnumerator<T> GetEnumerator()
{
var appends = new Stack<AppendPrependIterator<T>>();
IEnumerable<T> seq = this;

while (true)
{
var iterator = seq as AppendPrependIterator<T>;
if (iterator == null) { break; }

if (iterator is AppendIterator<T>)
{
appends.Push(iterator);
}
else // (iterator is PrependIterator<T>)
{
yield return iterator.element;
}
seq = iterator.sequence;
}

foreach (var e in seq) { yield return e; }
while (appends.Count > 0) { yield return appends.Pop().element; }
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}
}
63 changes: 0 additions & 63 deletions Plugin/EnumerableExtensions/EnumerableExtensions.cs
Expand Up @@ -34,68 +34,5 @@ public static IEnumerable<Pair<T>> AdjacentPairs<T>(this IEnumerable<T> sequence

yield return new Pair<T>(previous, first);
}

public static IEnumerable<T> Append<T>(this IEnumerable<T> sequence, T element)
{
return new AppendIterator<T>(sequence, element);
}

public static IEnumerable<T> Prepend<T>(this IEnumerable<T> sequence, T element)
{
return new PrependIterator<T>(sequence, element);
}

private sealed class AppendIterator<T> : AppendPrependIterator<T>
{
public AppendIterator(IEnumerable<T> sequence, T element) : base(sequence, element) { }
}

private sealed class PrependIterator<T> : AppendPrependIterator<T>
{
public PrependIterator(IEnumerable<T> sequence, T element) : base(sequence, element) { }
}

private abstract class AppendPrependIterator<T> : IEnumerable<T>
{
private readonly T element;
private readonly IEnumerable<T> sequence;

protected AppendPrependIterator(IEnumerable<T> sequence, T element)
{
if (sequence == null) { throw new ArgumentNullException("sequence"); }
this.element = element;
this.sequence = sequence;
}

public IEnumerator<T> GetEnumerator()
{
var appends = new Stack<AppendPrependIterator<T>>();
IEnumerable<T> seq = this;

while (true)
{
var iterator = seq as AppendPrependIterator<T>;
if (iterator == null) { break; }

if (iterator is AppendIterator<T>)
{
appends.Push(iterator);
}
else // (iterator is PrependIterator<T>)
{
yield return iterator.element;
}
seq = iterator.sequence;
}

foreach (var e in seq) { yield return e; }
while (appends.Count > 0) { yield return appends.Pop().element; }
}

System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
}
}
1 change: 1 addition & 0 deletions Plugin/Kethane.csproj
Expand Up @@ -46,6 +46,7 @@
</Reference>
</ItemGroup>
<ItemGroup>
<Compile Include="EnumerableExtensions\AppendPrepend.cs" />
<Compile Include="EnumerableExtensions\MinMaxBy.cs" />
<Compile Include="EnumerableExtensions\ReverseComparer.cs" />
<Compile Include="GeodesicGrid\BoundsMap.cs" />
Expand Down

0 comments on commit 62c4954

Please sign in to comment.