using System.Collections.Generic;
var seq = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
var pipe = new Pipe<int>(seq);
if (!pipe.TryTake(out var v))
Console.WriteLine($"Outer enumeration: {v}");
static void Process(Pipe<int> pipe)
foreach (var v in pipe.Take(3))
Console.WriteLine($"Inner enumeration: {v}");
public Pipe(IEnumerable<T> seq) => payload = seq.ToList();
public bool TryTake(out T t)
if (currIndex >= payload.Count)
public IEnumerable<T> Take(int n)
var newIndex = Math.Min(currIndex + n, payload.Count);
var result = payload.Skip(currIndex).Take(newIndex - currIndex);