public async Task ReportsExceptionsWithReferenceTypes()
        {
            var inputValues = AsyncEnumerableProvider.GetObjects(100);

            Func <DummyClass, Task <DummyClass> > action = async(DummyClass input) =>
            {
                await Task.Delay(10);

                if (input.MyInt % 10 == 0)
                {
                    throw new Exception("We don't like 10s");
                }

                return(new DummyClass(input.MyInt * 2));
            };

            var results = new ConcurrentBag <Result <DummyClass, DummyClass> >();

            await foreach (var result in inputValues.SafeParallelAsyncWithResult(action))
            {
                results.Add(result);
            }

            results.Count().ShouldBe(100);
            results.Count(r => r.Success).ShouldBe(90);
            results.Count(r => !r.Success).ShouldBe(10);
            results.First(r => !r.Success).Exception.ShouldNotBeNull();
            results.First(r => !r.Success).Exception.Message.ShouldBe("We don't like 10s");
            results.Select(r => r.Input.MyInt).ShouldBe(Enumerable.Range(1, 100), true);
            results.First(r => !r.Success).Output.ShouldBe(null);
        }
        public async Task HandlesReferenceTypes()
        {
            var inputValues = AsyncEnumerableProvider.GetObjects(100);
            var expected    = Enumerable.Range(1, 100).Sum(i => i * 2);
            int actual      = 0;

            Func <DummyClass, Task <DummyClass> > action = async(DummyClass input) =>
            {
                await Task.Delay(10);

                return(new DummyClass(input.MyInt * 2));
            };

            await foreach (var result in inputValues.SafeParallelAsyncWithResult(action))
            {
                actual += result.Output.MyInt;
            }

            actual.ShouldBe(expected);
        }