DasherJava / src / dasherJava / core / collections / CyclicIterator.java
CyclicIterator.java
Raw
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);
	}
}