docs: public static <T> Iterator<T> cycle(final Iterable<T> iterable) {
      checkNotNull(iterable);
      return new Iterator<T>() {
        Iterator<T> iterator = emptyIterator();
        Iterator<T> removeFrom;
  
        @Override
        public boolean hasNext() {
          if (!iterator.hasNext()) {
            iterator = iterable.iterator();
          }
          return iterator.hasNext();
        }
        @Override
        public T next() {
          if (!hasNext()) {
            throw new NoSuchElementException();
          }
          removeFrom = iterator;
          return iterator.next();
        }
        @Override
        public void remove() {
          checkRemove(removeFrom != null);
          removeFrom.remove();
          removeFrom = null;
        }
      };
    }