title: asynchronous python itertools chain multiple generators
body: <p><strong>UPDATED QUESTION FOR CLARITY:</strong></p>
  <p>suppose I have 2 processing generator functions:</p>
  <pre><code>def gen1(): # just for examples,
    yield 1   # yields actually carry 
    yield 2   # different computation weight 
    yield 3   # in my case
  
  def gen2():
    yield 4
    yield 5
    yield 6
  </code></pre>
  <p>I can chain them with itertools</p>
  <pre><code>from itertools import chain
  
  mix = chain(gen1(), gen2())
  </code></pre>
  <p>and then I can create another generator function object with it,</p>
  <pre><code>def mix_yield():
     for item in mix:
        yield item
  </code></pre>
  <p>or simply if I just want to <code>next(mix)</code>, it's there.</p>
  <p><strong>My question is, how can I do the equivalent in asynchronous code?</strong></p>
  <p>Because I need it to:</p>
  <ul>
  <li>return in yield (one by one), or with <code>next</code> iterator</li>
  <li>the fastest resolved yield first (async)</li>
  </ul>
  <p><strong>PREV. UPDATE:</strong></p>
  <p>After experimenting and researching, I found <a href="https://aiostream.readthedocs.io/en/latest/index.html" rel="noreferrer">aiostream</a> library which states as async version of itertools, so what I did:</p>
  <pre><code>import asyncio
  from aiostream import stream
  
  async def gen1(): 
       await asyncio.sleep(0) 
       yield 1 
       await asyncio.sleep(0) 
       yield 2 
       await asyncio.sleep(0) 
       yield 3 
  
  async def gen2(): 
       await asyncio.sleep(0) 
       yield 4 
       await asyncio.sleep(0) 
       yield 5 
       await asyncio.sleep(0) 
       yield 6 
  
  a_mix = stream.combine.merge(gen1(),gen2())
  
  async def a_mix_yield():
     for item in a_mix:
        yield item
  </code></pre>
  <p>but I still can't do <code>next(a_mix)</code></p>
  <pre><code>TypeError: 'merge' object is not an iterator
  </code></pre>
  <p>or <code>next(await a_mix)</code></p>
  <pre><code>raise StreamEmpty()
  </code></pre>
  <p>Although I still can make it into a list:</p>
  <pre><code>print(await stream.list(a_mix))
  # [1, 2, 4, 3, 5, 6]
  </code></pre>
  <p>so one goal is completed, one more to go:</p>
  <ul>
  <li><p>return in yield (one by one), or with <code>next</code> iterator</p>
  <p><del>- the fastest resolved yield first (async)</del></p>
  </li>
  </ul>