private static IEnumerable <Future> PipeToIterator(this Stream input, Stream output, byte[] buffer)
        {
            bool readAsync  = input.CanReadAsync();
            bool writeAsync = output.CanWriteAsync();

            while (true)
            {
                int read;
                if (readAsync)
                {
                    var readFuture = Future.FromAsyncPattern <int>(
                        ac => input.BeginRead(buffer, 0, buffer.Length, ac, null),
                        input.EndRead);
                    yield return(readFuture);

                    read = readFuture.Result;
                }
                else
                {
                    read = input.Read(buffer, 0, buffer.Length);
                }

                if (read == 0)
                {
                    yield break;
                }

                if (writeAsync)
                {
                    yield return(Future.FromAsyncPattern(
                                     ac => output.BeginWrite(buffer, 0, read, ac, null),
                                     ar =>
                    {
                        output.EndWrite(ar);
                        return 0;
                    }));
                }
                else
                {
                    output.Write(buffer, 0, read);
                }
            }
        }