using System.Collections; using System.Collections.Generic; namespace Disco { public static class EnumerableExtensions { public static IEnumerable> Chunk(this IEnumerable source, int ChunkSize) { List buffer = new List(ChunkSize); foreach (var item in source) { buffer.Add(item); if (buffer.Count == ChunkSize) { yield return buffer; buffer = new List(); } } // Return any additional items if (buffer.Count > 0) yield return buffer; } } public static class OneOf { public static OneOf Create(T instance) => OneOf.Create(instance); } public struct OneOf : IEnumerable { private readonly T instance; private OneOf(T instance) { this.instance = instance; } public static OneOf Create(T instance) => new OneOf(instance); public IEnumerator GetEnumerator() => new OneOfEnumerator(instance); IEnumerator IEnumerable.GetEnumerator() => new OneOfEnumerator(instance); private struct OneOfEnumerator : IEnumerator { private readonly T instance; private bool moved; public OneOfEnumerator(T instance) { this.instance = instance; moved = false; } public T Current => instance; object IEnumerator.Current => instance; public void Dispose() { } public bool MoveNext() { if (!moved) { moved = true; return true; } return false; } public void Reset() { moved = false; } } } }