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}