package edu.stanford.nlp.util; import java.util.*; import java.util.stream.Stream; /** * This cures a pet peeve of mine: that you can't use an Iterator directly in * Java 5's foreach construct. Well, this one you can, dammit. * * @author Bill MacCartney */ public class IterableIterator<E> implements Iterator<E>, Iterable<E> { private Iterator<E> it; private Iterable<E> iterable; private Stream<E> stream; public IterableIterator(Iterator<E> it) { this.it = it; } public IterableIterator(Iterable<E> iterable) { this.iterable = iterable; this.it = iterable.iterator(); } public IterableIterator(Stream<E> stream) { this.stream = stream; this.it = stream.iterator(); } public boolean hasNext() { return it.hasNext(); } public E next() { return it.next(); } public void remove() { it.remove(); } public Iterator<E> iterator() { if (iterable != null) { return iterable.iterator(); } else if (stream != null) { return stream.iterator(); } else { return this; } } @Override public Spliterator<E> spliterator() { if (iterable != null) { return iterable.spliterator(); } else if (stream != null) { return stream.spliterator(); } else { return Spliterators.spliteratorUnknownSize(it, Spliterator.ORDERED | Spliterator.CONCURRENT); } } }