import java.util.ArrayList;
public class ListSeq<E extends Object> implements Seq<E> {
// Private Mutable State
private /*@ non_null @*/ final ArrayList<E> list = new ArrayList<E>();
private Integer pos = 1;
/*@ private invariant 1 <= pos;
@ private invariant pos <= length() + 1;
*/
// Constructor
public ListSeq( /*@ non_null @*/ E[] elements) {
for (E element : elements) {
list.add(element);
}
}
// Interface Seq
@Override
public void forth() {
if (pastEnd()) return;
pos++;
}
@Override
public Integer pos() {
if (pastEnd()) throw new IndexOutOfBoundsException("There is no position past the end of the sequence.");
return pos;
}
@Override
public E current() {
return list.get(pos-1);
}
@Override
public Integer length() {
return list.size();
}
@Override
public Boolean pastEnd() {
return pos.equals(length()+1);
}
}