package dml.runtime;
import java.util.Iterator;
import java.util.NoSuchElementException;
import jvstm.util.Cons;
public class FunctionalSet<E> {
public static final FunctionalSet EMPTY = new FunctionalSet(0, Cons.empty());
protected final int size;
protected final Cons<E> elems;
protected FunctionalSet(int size, Cons<E> elems) {
this.size = size;
this.elems = elems;
}
public int size() {
return size;
}
public E get(int index) {
if (index > (size - 1)) {
throw new NoSuchElementException();
} else {
Cons<E> iter = elems;
while (index-- > 0) {
iter = iter.rest();
}
return iter.first();
}
}
public FunctionalSet<E> addUnique(E obj) {
return makeFunctionalSet(size + 1, elems.cons(obj));
}
public FunctionalSet<E> add(E obj) {
if (elems.contains(obj)) {
return this;
} else {
return addUnique(obj);
}
}
public FunctionalSet<E> remove(Object obj) {
if (! elems.contains(obj)) {
return this;
} else {
return removeExisting(obj);
}
}
private FunctionalSet<E> removeExisting(Object obj) {
return makeFunctionalSet(size - 1, elems.removeFirst(obj));
}
public boolean contains(Object obj) {
return elems.contains(obj);
}
public Iterator<E> iterator() {
return elems.iterator();
}
protected FunctionalSet<E> makeFunctionalSet(int size, Cons<E> elems) {
return new FunctionalSet<E>(size, elems);
}
}