package jetbrains.mps.baseLanguage.closures.runtime; /*Generated by MPS */ import java.util.Iterator; import java.util.NoSuchElementException; /** * * @author fyodor */ public abstract class YieldingIterator<T> implements Iterator<T> { private T yielded; private YieldingIterator.State state = YieldingIterator.State.UNKNOWN; private DelayedException delayedEx; public YieldingIterator() { } @Override public boolean hasNext() { if (state == YieldingIterator.State.UNKNOWN) { try { this.state = ((this.moveToNext() ? YieldingIterator.State.HAS_NEXT : YieldingIterator.State.AT_END)); } catch (DelayedException ex) { this.state = YieldingIterator.State.AT_END; throw ex; } } if (delayedEx != null) { DelayedException tmp = this.delayedEx; this.delayedEx = null; throw tmp; } return state == YieldingIterator.State.HAS_NEXT; } @Override public T next() { switch (state) { case AT_END: throw new NoSuchElementException(); case UNKNOWN: try { if (!(this.moveToNext())) { this.state = YieldingIterator.State.AT_END; throw new NoSuchElementException(); } } catch (DelayedException ex) { this.delayedEx = ex; this.state = YieldingIterator.State.AT_END; throw new NoSuchElementException(); } case HAS_NEXT: T res = this.yielded; this.yielded = null; this.state = YieldingIterator.State.UNKNOWN; return res; default: throw new IllegalStateException(); } } @Override public void remove() { throw new UnsupportedOperationException(); } protected abstract boolean moveToNext(); protected void yield(T t) { this.yielded = t; } private enum State { HAS_NEXT(), AT_END(), UNKNOWN(); private State() { } } }