code: def merge(*iterables, key=None, reverse=False):
      """Merge multiple sorted inputs into a single sorted output.
  
      Similar to sorted(itertools.chain(*iterables)) but returns a generator,
      does not pull the data into memory all at once, and assumes that each of
      the input streams is already sorted (smallest to largest).
  
      >>> list(merge([1,3,5,7], [0,2,4,8], [5,10,15,20], [], [25]))
      [0, 1, 2, 3, 4, 5, 5, 7, 8, 10, 15, 20, 25]
  
      If *key* is not None, applies a key function to each element to determine
      its sort order.
  
      >>> list(merge(['dog', 'horse'], ['cat', 'fish', 'kangaroo'], key=len))
      ['dog', 'cat', 'fish', 'horse', 'kangaroo']
  
      """
  
      h = []
      h_append = h.append
  
      if reverse:
          _heapify = _heapify_max
          _heappop = _heappop_max
          _heapreplace = _heapreplace_max
          direction = -1
      else:
          _heapify = heapify
          _heappop = heappop
          _heapreplace = heapreplace
          direction = 1
  
      if key is None:
          for order, it in enumerate(map(iter, iterables)):
              try:
                  next = it.__next__
                  h_append([next(), order * direction, next])
              except StopIteration:
                  pass
          _heapify(h)
          while len(h) > 1:
              try:
                  while True:
                      value, order, next = s = h[0]
                      yield value
                      s[
                          0
                      ] = next()  # raises StopIteration when exhausted
                      _heapreplace(h, s)  # restore heap condition
              except StopIteration:
                  _heappop(h)  # remove empty iterator
          if h:
              # fast case when only a single iterator remains
              value, order, next = h[0]
              yield value
              yield from next.__self__
          return
  
      for order, it in enumerate(map(iter, iterables)):
          try:
              next = it.__next__
              value = next()
              h_append([key(value), order * direction, value, next])
          except StopIteration:
              pass
      _heapify(h)
      while len(h) > 1:
          try:
              while True:
                  key_value, order, value, next = s = h[0]
                  yield value
                  value = next()
                  s[0] = key(value)
                  s[2] = value
                  _heapreplace(h, s)
          except StopIteration:
              _heappop(h)
      if h:
          key_value, order, value, next = h[0]
          yield value
          yield from next.__self__
  
file_path: cpython/Lib/heapq.py
label_desc: Use image node_id 13 for calling a global function with example usage: merge() without return types