package jetbrains.mps.internal.collections.runtime.impl;
/*Generated by MPS */
import jetbrains.mps.internal.collections.runtime.Sequence;
import jetbrains.mps.internal.collections.runtime.ISequence;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class ConcatingSequence<U> extends Sequence<U> {
private final ISequence<? extends U> left;
private final ISequence<? extends U> right;
public ConcatingSequence(ISequence<? extends U> left, ISequence<? extends U> right) {
if (left == null || right == null) {
throw new NullPointerException();
}
this.left = left;
this.right = right;
}
@Override
public Iterator<U> iterator() {
return new ConcatingSequence.ConcatingIterator();
}
private class ConcatingIterator implements Iterator<U> {
private U next;
private HasNextState hasNext = HasNextState.UNKNOWN;
private Iterator<? extends U> leftIt;
private Iterator<? extends U> rightIt;
private ConcatingIterator() {
}
@Override
public boolean hasNext() {
if (leftIt == null || rightIt == null) {
init();
}
if (hasNext.unknown()) {
moveToNext();
}
return hasNext.hasNext();
}
@Override
public U next() {
if (leftIt == null || rightIt == null) {
init();
}
if (hasNext.unknown()) {
moveToNext();
}
if (!((hasNext.hasNext()))) {
throw new NoSuchElementException();
}
return clearNext();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
private void init() {
leftIt = left.toIterable().iterator();
rightIt = right.toIterable().iterator();
}
private void moveToNext() {
next = null;
hasNext = HasNextState.AT_END;
if (leftIt.hasNext()) {
setNext(leftIt.next());
} else
if (rightIt.hasNext()) {
setNext(rightIt.next());
}
}
private U clearNext() {
U tmp = next;
next = null;
hasNext = HasNextState.UNKNOWN;
return tmp;
}
private void setNext(U next) {
this.next = next;
hasNext = HasNextState.HAS_NEXT;
}
}
}