public void OneIteration(
     [ValueSource("CountRange")] int count)
 {
     var source = new SinglePassSequence<int>(Enumerable.Range(1, count));
     var expected = Enumerable.Range(1, count);
     Assert.That(source.SequenceEqual(expected));
 }
        public void MultipleIterations(
            [Random(Int32.MinValue, Int32.MaxValue, 1)] int seed
            , [Range(5, 20, 15)] int iterators
            , [Range(20, 2000, 1980)] int range)
        {
            Random rnd = new Random(seed);
            var source = new SinglePassSequence<int>(Enumerable.Range(1, range));
            var enumerators = Enumerable.Range(1, iterators).Select(x => source.GetEnumerator()).ToList();
            var resultBuffers = Enumerable.Range(1, iterators).Select(x => new List<int>(range)).ToList();

            while (enumerators.Count > 0)
            {
                int e = rnd.Next(enumerators.Count);
                if (enumerators[e].MoveNext())
                {
                    resultBuffers[e].Add(enumerators[e].Current);
                }
                else
                {
                    Assert.That(Enumerable.Range(1, range).SequenceEqual(resultBuffers[e]));
                    resultBuffers.RemoveAt(e);
                    enumerators[e].Dispose();
                    enumerators.RemoveAt(e);
                }
            }
        }
        public void Example8()
        {
            var source = new SinglePassSequence<int>(Enumerable.Range(1, 100));

            var result = source
                .Zip(source.Skip(1), (l, r) => Tuple.Create(l, r))
                .Zip(source.Skip(2), (l, r) => Tuple.Create(l.Item1, l.Item2, r))
                .Skip(10)
                .Take(2);

            var expected = new List<Tuple<int, int, int>> {
                    Tuple.Create(11, 12, 13)
                    , Tuple.Create(12, 13, 14)
                };
            Assert.That(result.SequenceEqual(expected));
        }