// $Id: ConsIterator.java,v 1.6 1999/12/16 16:26:53 leavens Exp $

package lib;

public class ConsIterator implements Iterator {
    protected Cons ptr;

    public ConsIterator(Cons cell) {
        ptr = cell;
    }

    /** is there a current element? */
    public boolean hasMore() {
        return ptr != null;
    }

    /** move to the next element, provided hasMore() is true */
    public void advance()
    //@ requires: hasMore();
    {
        Object tail = ptr.cdr();
        ptr = ((tail == null) ? null : (Cons)tail);
    }

    /** get the current element, provided hasMore() is true */
    public /*@ pure @*/ Object getElement()
    //@ requires: hasMore();
    {
        return ptr.car();
    }

    public static void main(String [] argv) {
        Cons myCell = new Cons(1.0,
                               new Cons(2.0, null));
        ConsIterator myIter;
        double res = 0.0;
        for (myIter = new ConsIterator(myCell);
             myIter.hasMore();
             myIter.advance()) {
            res += ((Double) myIter.getElement())
                                   .doubleValue();
            System.out.println("The elem is "
                               + (Double) myIter.getElement());
        }
        System.out.println("res is " + res);
    }

}
