code: async def zip(*sources):
      
      async with AsyncExitStack() as stack:
          # Handle resources
          streamers = [await stack.enter_async_context(streamcontext(source))
                       for source in sources]
          # Loop over items
          while True:
              try:
                  coros = builtins.map(anext, streamers)
                  items = await asyncio.gather(*coros)
              except StopAsyncIteration:
                  break
              else:
                  yield tuple(items)
docs: Combine and forward the elements of several asynchronous sequences.
  
      Each generated value is a tuple of elements, using the same order as
      their respective sources. The generation continues until the shortest
      sequence is exhausted.
  
      Note: the different sequences are awaited in parrallel, so that their
      waiting times don't add up.