package org.osgl.util;
import java.util.EnumSet;
import java.util.Iterator;
import static org.osgl.util.C.Feature.LAZY;
import static org.osgl.util.C.Feature.READONLY;
/**
* Create a view of two sequence combined together
*/
class CompositeRSeq<T> extends ReversibleSeqBase<T> {
private final C.ReversibleSequence<T> left;
private final C.ReversibleSequence<T> right;
private EnumSet<C.Feature> features;
CompositeRSeq(C.ReversibleSequence<T> left, C.ReversibleSequence<T> right) {
E.NPE(left, right);
if (left.isEmpty() || right.isEmpty()) {
throw new IllegalArgumentException("left or right cannot be empty");
}
this.left = left;
this.right = right;
features = left.features();
features.retainAll(right.features());
features.add(READONLY);
}
static <T> C.ReversibleSequence<T> of(C.ReversibleSequence<T> left, C.ReversibleSequence<T> right) {
return new CompositeRSeq<T>(left, right);
}
protected C.ReversibleSequence<T> left() {
return left;
}
protected C.ReversibleSequence<T> right() {
return right;
}
@Override
protected EnumSet<C.Feature> initFeatures() {
EnumSet<C.Feature> features = left.features();
features.retainAll(right.features());
features.add(READONLY);
features.add(LAZY);
return features;
}
@Override
public final int size() throws UnsupportedOperationException {
return left.size() + right.size();
}
@Override
public final Iterator<T> iterator() {
return Iterators.composite(left.iterator(), right.iterator());
}
@Override
public Iterator<T> reverseIterator() {
return Iterators.composite(right.reverseIterator(), left.reverseIterator());
}
@Override
public final boolean isEmpty() {
return left.isEmpty() && right.isEmpty();
}
}