package dasherJava.core.collections;
import java.util.Iterator;
public class CyclicIterator<E> implements Iterator<E> {
private final Iterable<E> iterable;
private Iterator<E> currentIterator;
public CyclicIterator(Iterable<E> iterable) {
this.iterable=iterable;
currentIterator=iterable.iterator();
}
@Override
public boolean hasNext() { //can only return false if the iterable is empty
return currentIterator.hasNext();
}
@Override
public E next() {
E e = currentIterator.next();
if (!currentIterator.hasNext()) currentIterator=iterable.iterator(); //endless cyclic iteration
return e;
}
public static <E> E getNextOrNull(CyclicIterator<E> iterator) {
return iterator!=null && iterator.hasNext() ? iterator.next() : null;
}
public static <E> CyclicIterator<E> copyCyclicIterator(CyclicIterator<E> cyclicIterator) { //copy, but iteration
//restarts from the beginning
if (cyclicIterator==null) return null;
return new CyclicIterator<>(cyclicIterator.iterable);
}
}