private boolean tryToComputeNext() { state = State.FAILED; // temporary pessimism next = computeNext(); if (state != State.DONE) { state = State.READY; return true; } return false; }
@Override public final T next() { if (!hasNext()) { throw new NoSuchElementException(); } state = State.NOT_READY; T result = next; next = null; return result; }
@Override public final boolean hasNext() { checkState(state != State.FAILED); switch (state) { case READY: return true; case DONE: return false; default: } return tryToComputeNext(); }