Reverse.java

package lrs.visitor;

import lrs.*;
/**
* Reverses the host using local anonymous inner class as a helper visitor.
* @author DXN
*/
public class Reverse implements IAlgo {
    public static final Reverse Singleton = new Reverse ();
    private Reverse () {
    }

    /**
     * Does nothing: the empty host is the reverse of itself.
     * @return null
     */
    public Object emptyCase(LRStruct host, Object... nu) {
        return null;
    }

    /**
     * Asks for help to recursively move down the host, removes one element at
     * a time and inserting it to the front of the host.  In the end, the host
     * is reversed.
     * @return null
     */
    public Object nonEmptyCase(final LRStruct host, Object... nu) {
        return host.getRest().execute(new IAlgo (){
            /**
             * Does nothing because the end of the original host is reached.
             * From host to h is the reverse of the original list.
             * @param h the remaining tail of the list to be reversed.
             * @param nu not used.
             * @return null.
             */
            public Object emptyCase(LRStruct h, Object... nu) {
                return null;
            }

            /**
             * Removes the current list's first and insert it to the front of
             * the original host and recurs.
             * @param h the remaining tail of the list to be reversed.
             * @param nu not used.
             * @return null.
             */
            public Object nonEmptyCase(LRStruct h, Object... nu) {
                Object hFirst = h.removeFront(); // h has "advanced".
                host.insertFront (hFirst);  // host is in the closure!
                return h.execute(this);
            }
        });
    }
}