code: public static <A> Iterator<Pair<Integer, A>> indexed(final Iterator<? extends A> iterator) {
  		if (iterator == null)
  			throw new NullPointerException("iterator");
  		return new AbstractIterator<Pair<Integer, A>>() {
  			int i = 0;
  			@Override
  			protected Pair<Integer, A> computeNext() {
  				if (iterator.hasNext()) {
  					Pair<Integer, A> next = new Pair<Integer, A>(i, iterator.next());
  					if (i != Integer.MAX_VALUE)
  						i++;
  					return next;
  				} else {
  					return endOfData();
  				}
  			}
  		};
  	}
docs: Returns an Iterator of Pairs where the nth pair is created by taking the nth element of the source as the value
  and its 0-based index as the key. E.g.
  <code>zipWitIndex(#["a", "b", "c"]) == #[(0, "a"), (1, "b"), (2, "c")]</code>
  
  If the index would overflow, {@link Integer#MAX_VALUE} is returned for all subsequent elements.
  
  The resulting Iterator is a lazily computed view, so any modifications to the underlying Iterator will be
  reflected on iteration. The result does not support {@link Iterator#remove()}
  
  @param iterator
  the elements. May not be <code>null</code>.
  @return the zipped result
  @since 2.7