001package net.automatalib.commons.util.collections; 002 003import java.util.Iterator; 004import java.util.NoSuchElementException; 005 006public abstract class SimplifiedIterator<E> implements Iterator<E> { 007 008 private static enum State { 009 AWAIT_NEXT, 010 HAS_NEXT, 011 FINISHED 012 } 013 014 private State state = State.AWAIT_NEXT; 015 protected E nextValue = null; 016 017 protected abstract boolean calculateNext(); 018 019 private boolean advance() { 020 boolean ret = calculateNext(); 021 if(!ret) { 022 state = State.FINISHED; 023 } 024 else { 025 state = State.HAS_NEXT; 026 } 027 return ret; 028 } 029 030 @Override 031 public boolean hasNext() { 032 switch(state) { 033 case AWAIT_NEXT: 034 return advance(); 035 case HAS_NEXT: 036 return true; 037 default: // case FINISHED: 038 return false; 039 } 040 } 041 042 @Override 043 public E next() { 044 if(!hasNext()) 045 throw new NoSuchElementException(); 046 state = State.AWAIT_NEXT; 047 return nextValue; 048 } 049 050}