All of the sequence classes presented in this monograph--immutable and mutable--support the operations in the following Seq interface
interface Seq {
Seq empty();
// returns Seq that is empty
Seq cons(Object newElt);
// returns the Seq with elts newElt, s[0], ..., s[n]
Object first(); // returns the element s[0]
Seq rest(); // returns an object representing s[1], ..., s[n]
Object eltAt(int i); // returns the element s[i]
boolean isEmpty(); // returns n == 0
public Object execute(SeqVisitor host); // applies the visitor code host
}
interface SeqVisitor {
Object forEmpty(Seq host);
Object forCons(Seq host);
}
The contracts for all of these operations stipulate that they do not
modify the observable state of a sequence object.
Immutable sequence classes also support the two additional functional operations in the following interface:
interface FinalSeq extends Seq {
Seq updateFirst(Object val); // returns val,this[1], ...,this[n]
Seq updateRest(Seq r);
// given r[0],...,r[m] returns this[0],r[0], ..., r[m]
}
These two operations return new sequence values; they do not
modify this.
There are two widely used representations for immutable sequences: linked and contiguous.