001    package lrs;
002    
003    import lrs.lazyLRSEvaluators.*;
004    /**
005     * Decorator for NonNullState, adding lazy evaluation capability.
006     * @author D. X. Nguyen & S. B. Wong
007     */
008    public class LazyNonNullState extends ANode{
009      ALazyEval aLazyEval;
010      NENode neNode;
011      
012      LazyNonNullState(Object first, ALazyEval aLazyEval) {
013        neNode = new NENode (first, new LRStruct());
014        this.aLazyEval = aLazyEval;
015      }
016      
017      LRStruct getRest(LRStruct owner) {
018        eval (owner);
019        return (neNode.getRest (owner));
020      }
021      
022      LRStruct setRest(LRStruct tail, LRStruct owner) {
023        eval (owner);
024        return neNode.setRest (tail, owner);
025      }
026      
027      LRStruct setFirst(Object first, LRStruct owner) {
028        return neNode.setFirst (first, owner);
029      }
030      
031      LRStruct insertFront(Object dat, LRStruct owner) {
032        return neNode.insertFront (dat, owner);
033      }
034      
035      Object removeFront(LRStruct owner) {
036        eval (owner);
037        return (neNode.removeFront (owner));
038      }
039      
040      void eval(LRStruct owner) {
041        owner.setHead (neNode);  // owner no longer needs lazy eval.
042        owner.setRest (aLazyEval.nextLRS ());   // But owner's tail does!
043      }
044      
045      Object getFirst(LRStruct owner) {
046        return (neNode.getFirst (owner)); // lazy eval not needed.
047      }
048      
049      Object execute(LRStruct host, IAlgo visitor, Object... param)  {
050        return (neNode.execute (host, visitor, param));
051      }
052    }
053