code: def _index_iterator(column_size, max_size, mix_index=False):
          
          # todo implement a proper partial factorial design
          indexes = [0] * len(column_size)
  
          index_order = [0]
          if mix_index:
              for i in range(1, max(column_size)):
                  index_order += [-1 * i, i]
          else:
              index_order += range(1, max(column_size))
  
          for i in range(max_size):
              yield [index_order[indexes[i]] for i in range(len(indexes))]
  
              for index in range(len(column_size)):
                  indexes[index] += 1
                  if indexes[index] < column_size[index]:
                      break
  
                  indexes[index] = 0
                  if index == len(column_size) - 1:
                      if sys.version_info[0] == 2:
                          raise StopIteration()
                      else:
                          return
docs: This will iterate over the indexes and return a list of indexes
          :param column_size: list of int of the size of each list
          :param max_size: int of the max number of iterations
          :param mix_index: bool if True will go first then last then middle
          :return: list of int of indexes