code: def split_iterable_as_iterable(self, values):
          values = iter(enumerate(values))
          cache = dict()
          def get_value(ti):
              try:
                  return cache.pop(ti)
              except:
                  while True:
                      i, v = next(values)
                      if i==ti:
                          return v
                      cache[i] = v
          s = iter(self.index.sorter)
          for c in self.count:
              yield (get_value(i) for i in itertools.islice(s, int(c)))