code: public static <T> List<List<T>> chop(Iterable<T> self, int... chopSizes) {
          return chop(self.iterator(), chopSizes);
      }
docs: Chops the Iterable into pieces, returning lists with sizes corresponding to the supplied chop sizes.
  If the Iterable isn't large enough, truncated (possibly empty) pieces are returned.
  Using a chop size of -1 will cause that piece to contain all remaining items from the Iterable.
  <p>
  Example usage:
  <pre class="groovyTestCase">
  assert [1, 2, 3, 4].chop(1) == [[1]]
  assert [1, 2, 3, 4].chop(1,-1) == [[1], [2, 3, 4]]
  assert ('a'..'h').chop(2, 4) == [['a', 'b'], ['c', 'd', 'e', 'f']]
  assert ['a', 'b', 'c', 'd', 'e'].chop(3) == [['a', 'b', 'c']]
  assert ['a', 'b', 'c', 'd', 'e'].chop(1, 2, 3) == [['a'], ['b', 'c'], ['d', 'e']]
  assert ['a', 'b', 'c', 'd', 'e'].chop(1, 2, 3, 3, 3) == [['a'], ['b', 'c'], ['d', 'e'], [], []]
  </pre>
  
  @param self      an Iterable to be chopped
  @param chopSizes the sizes for the returned pieces
  @return a list of lists chopping the original iterable into pieces determined by chopSizes
  @see #collate(Iterable, int) to chop an Iterable into pieces of a fixed size
  @since 2.5.2