package com.reactivecascade.i.functional; import com.reactivecascade.functional.ConcurrentIteratorItem; import com.reactivecascade.i.ICancellable; import java.util.NoSuchElementException; /** * Created by Paul Houghton on 3/26/2015. */ public interface IConcurrentIterator<T> extends ICancellable { /** * Get the next element after registering a {@link com.reactivecascade.i.functional.IConcurrentIterator.StateListener} * and receiving <code>HAS_NEXT</code>. * * If the list is of finite length, the listener notification of transition to state <code>FINISHED</code> will occur * after the last value has been fetched. Since this transition may involve multiple threads, a * race condition may result in {@link java.util.NoSuchElementException} which can be treated * as equivalent to <code>SLEEP</code> which signals that the listener should pause reading items * until it receives the next state change notification. * * @return * @throws {@link java.util.NoSuchElementException} if state is anything other than <code>HAS_NEXT</code>. */ ConcurrentIteratorItem<T> next() throws NoSuchElementException; void addStateListener(StateListener stateListener); enum State {HAS_NEXT, SLEEP, FINISHED, CANCELLED} interface StateListener { void stateChange(State state); } }