// file: Incremental.java // author: Robert Keller // purpose: Class Incremental of Poly package package Poly; public class Incremental extends List { Object value; public Object first() throws EmptyListException { ensureGrown(); return ((List)value).first(); } public List rest() throws EmptyListException { ensureGrown(); return ((List)value).rest(); } public NonEmptyList getNonEmpty() throws EmptyListException { ensureGrown(); return (NonEmptyList)value; } public boolean isEmpty() { ensureGrown(); return ((List)value).isEmpty(); } public boolean nonEmpty() { ensureGrown(); return ((List)value).nonEmpty(); } public String toString() { if( value instanceof Growable ) return "..."; else return ((List)value).toString(); } public Incremental(Growable growable) { value = growable; } public void ensureGrown() { while( value instanceof Growable ) { value = ((Growable)value).grow(); } } // use with caution! public boolean grown() { return !(value instanceof Growable); } public List getList() { ensureGrown(); return (List)value; } }