First, let's talk about the QuickStream structure:
- The poll_next() function will continuously be invoked, and with each iteration, i's ticks attribute will be decremented by 1
- Polling will stop when the ticks attribute reaches 0 and returns futures::Async::Ready<None>
Within the quick_streams() function:
- We build a futures::task::Context by using futures::future::poll_on(f: FnMut(|cx: Context|)), so that we can explicitly invoke QuickStream's poll_next() function on lines 42 and 50
- Since we have declared 10 ticks on line 38, our first two block_on's poll_next() calls should yield 9 and 8
- The next block_on call, on line 57, will keep polling QuickStream until futures::Async::Ready<None> is returned from the ticks attribute equaling zero
Within iterate_streams():
- futures::stream::iter_ok will convert an Iterator into a Stream, which will always be ready to return the next value
- futures::stream::iter_result does the same thing as iter_ok...