package org.osgl.util;
import org.osgl.$;
import java.util.EnumSet;
import java.util.List;
import java.util.ListIterator;
/**
* Created with IntelliJ IDEA.
* User: luog
* Date: 10/11/13
* Time: 8:40 PM
* To change this template use File | Settings | File Templates.
*/
class ZippedList<A, B> extends ListBase<$.T2<A, B>> {
private List<A> a;
private List<B> b;
private $.Option<A> defA = $.none();
private $.Option<B> defB = $.none();
ZippedList(List<A> a, List<B> b) {
E.NPE(a, b);
this.a = a;
this.b = b;
}
ZippedList(List<A> a, List<B> b, A defA, B defB) {
E.NPE(a, b);
this.a = a;
this.b = b;
this.defA = $.some(defA);
this.defB = $.some(defB);
}
@Override
protected EnumSet<C.Feature> initFeatures() {
return EnumSet.of(C.Feature.LAZY, C.Feature.READONLY, C.Feature.LIMITED);
}
@Override
public int size() {
if (defA.isDefined()) {
return Math.max(a.size(), b.size());
} else {
return Math.min(a.size(), b.size());
}
}
@Override
public $.T2<A, B> get(int index) {
return $.T2(a.get(index), b.get(index));
}
@Override
public ListIterator<$.T2<A, B>> listIterator(int index) {
if (defA.isDefined()) {
return new ZippedListIterator<A, B>(a.listIterator(), b.listIterator(), defA.get(), defB.get());
}
return new ZippedListIterator<A, B>(a.listIterator(), b.listIterator());
}
}