code: def collapse(iterable, base_type=None, levels=None):
      
      def walk(node, level):
          if (
              ((levels is not None) and (level > levels)) or
              isinstance(node, (str, bytes)) or
              ((base_type is not None) and isinstance(node, base_type))
          ):
              yield node
              return
  
          try:
              tree = iter(node)
          except TypeError:
              yield node
              return
          else:
              for child in tree:
                  for x in walk(child, level + 1):
                      yield x
  
      yield from walk(iterable, 0)
docs: Flatten an iterable with multiple levels of nesting (e.g., a list of
      lists of tuples) into non-iterable types.
  
          >>> iterable = [(1, 2), ([3, 4], [[5], [6]])]
          >>> list(collapse(iterable))
          [1, 2, 3, 4, 5, 6]
  
      Binary and text strings are not considered iterable and
      will not be collapsed.
  
      To avoid collapsing other types, specify *base_type*:
  
          >>> iterable = ['ab', ('cd', 'ef'), ['gh', 'ij']]
          >>> list(collapse(iterable, base_type=tuple))
          ['ab', ('cd', 'ef'), 'gh', 'ij']
  
      Specify *levels* to stop flattening after a certain level:
  
      >>> iterable = [('a', ['b']), ('c', ['d'])]
      >>> list(collapse(iterable))  # Fully flattened
      ['a', 'b', 'c', 'd']
      >>> list(collapse(iterable, levels=1))  # Only one level flattened
      ['a', ['b'], 'c', ['d']]