code: def traverse(self, index=0):
          
          if index < len(self.nodes):
              for entity in self.nodes[index]:
                  for next_result in self.traverse(index=index+1):
                      if isinstance(entity, list):
                          yield entity + next_result
                      else:
                          yield [entity] + next_result
          else:
              yield []
docs: This is used to produce a list of lists where each each item
          in that list is a diffrent combination of items from the lists
          within with every combination of such values.
  
          Args:
              index (int) : the index at witch to start the list.
                  Note this is used only in the function as a processing
  
          Returns:
              list : is every combination.