package jetbrains.mps.internal.collections.runtime.impl; /*Generated by MPS */ import java.util.Iterator; import jetbrains.mps.internal.collections.runtime.ClassUtils; import java.util.NoSuchElementException; public class OfTypeSequence<U, V> extends AbstractChainedSequence<U, V> implements Iterable<V> { private Class<V> requestedType; public OfTypeSequence(Iterable<U> input, Class<V> reqType) { super(input); requestedType = reqType; } @Override public Iterator<V> iterator() { return new OfTypeSequence.OfTypeIterator(); } private boolean isOfType(U input) { return ClassUtils.isInstance(requestedType, input); } private V cast(U input) { if (ClassUtils.isInstance(requestedType, input)) { return ClassUtils.cast(requestedType, input); } return null; } private class OfTypeIterator implements Iterator<V> { private Iterator<U> inputIterator = null; private HasNextState hasNext = HasNextState.UNKNOWN; private V next; private OfTypeIterator() { } @Override public boolean hasNext() { if (inputIterator == null) { init(); } if (hasNext.unknown()) { moveToNext(); } return hasNext.hasNext(); } @Override public V next() { if (inputIterator == null) { init(); } if (hasNext.unknown()) { moveToNext(); } if (!(hasNext.hasNext())) { throw new NoSuchElementException(); } return clearNext(); } @Override public void remove() { throw new UnsupportedOperationException(); } private void init() { inputIterator = getInput().iterator(); } private void moveToNext() { hasNext = HasNextState.AT_END; next = null; while (inputIterator.hasNext()) { U tmp = inputIterator.next(); if (!(isOfType(tmp))) { continue; } hasNext = HasNextState.HAS_NEXT; next = cast(tmp); break; } } private V clearNext() { V tmp = next; next = null; hasNext = HasNextState.UNKNOWN; return tmp; } } }