package dasherJava.core.collections; import java.util.Iterator; public class CyclicIterator implements Iterator { private final Iterable iterable; private Iterator currentIterator; public CyclicIterator(Iterable 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 getNextOrNull(CyclicIterator iterator) { return iterator!=null && iterator.hasNext() ? iterator.next() : null; } public static CyclicIterator copyCyclicIterator(CyclicIterator cyclicIterator) { //copy, but iteration //restarts from the beginning if (cyclicIterator==null) return null; return new CyclicIterator<>(cyclicIterator.iterable); } }