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;
}
}
}