docs: public static <T> Iterable<T> skip(final Iterable<T> iterable, final int numberToSkip) {
      checkNotNull(iterable);
      checkArgument(numberToSkip >= 0, "number to skip cannot be negative");
  
      if (iterable instanceof List) {
        final List<T> list = (List<T>) iterable;
        return new FluentIterable<T>() {
          @Override
          public Iterator<T> iterator() {
            // TODO(kevinb): Support a concurrently modified collection?
            int toSkip = Math.min(list.size(), numberToSkip);
            return list.subList(toSkip, list.size()).iterator();
          }
        };
      }
  
      return new FluentIterable<T>() {
        @Override
        public Iterator<T> iterator() {
          final Iterator<T> iterator = iterable.iterator();
  
          Iterators.advance(iterator, numberToSkip);
  
          /*
           * We can't just return the iterator because an immediate call to its
           * remove() method would remove one of the skipped elements instead of
           * throwing an IllegalStateException.
           */
          return new Iterator<T>() {
            boolean atStart = true;
  
            @Override
            public boolean hasNext() {
              return iterator.hasNext();
            }
  
            @Override
            public T next() {
              T result = iterator.next();
              atStart = false; // not called if next() fails
              return result;
            }
  
            @Override
            public void remove() {
              checkRemove(!atStart);
              iterator.remove();
            }
          };
        }
      };
    }