code: def _islice(self, min_pos, min_idx, max_pos, max_idx, reverse):
          
          _lists = self._lists
  
          if min_pos > max_pos:
              return iter(())
          elif min_pos == max_pos and not reverse:
              return iter(_lists[min_pos][min_idx:max_idx])
          elif min_pos == max_pos and reverse:
              return reversed(_lists[min_pos][min_idx:max_idx])
          elif min_pos + 1 == max_pos and not reverse:
              return chain(_lists[min_pos][min_idx:], _lists[max_pos][:max_idx])
          elif min_pos + 1 == max_pos and reverse:
              return chain(
                  reversed(_lists[max_pos][:max_idx]),
                  reversed(_lists[min_pos][min_idx:]),
              )
          elif not reverse:
              return chain(
                  _lists[min_pos][min_idx:],
                  chain.from_iterable(_lists[(min_pos + 1):max_pos]),
                  _lists[max_pos][:max_idx],
              )
  
          temp = map(reversed, reversed(_lists[(min_pos + 1):max_pos]))
          return chain(
              reversed(_lists[max_pos][:max_idx]),
              chain.from_iterable(temp),
              reversed(_lists[min_pos][min_idx:]),
          )
docs: Returns an iterator that slices `self` using two index pairs,
          `(min_pos, min_idx)` and `(max_pos, max_idx)`; the first inclusive
          and the latter exclusive. See `_pos` for details on how an index
          is converted to an index pair.
  
          When `reverse` is `True`, values are yielded from the iterator in
          reverse order.