001    package lrs.visitor;
002    
003    import lrs.IAlgo;
004    import lrs.LRStruct;
005    import model.ILambda;
006    
007    /**
008     * Applies the lambda specified as input to all elements in the LRStruct.
009     *
010     * @author Mathias Ricken
011     */
012    public class Apply implements IAlgo {
013        /// singleton instance
014        public static final Apply Singleton = new Apply();
015    
016        /// private singleton ctor
017        private Apply() {
018        }
019    
020        /**
021         * Operates on an empty LRStruct host, given an input object.
022         *
023         * @param host an empty LRStruct.
024         * @param inp  ILambda to apply
025         *
026         * @return always null
027         */
028        public Object emptyCase(LRStruct host, Object inp) {
029            return null;
030        }
031    
032        /**
033         * Operates on a non-empty LRStruct host, given an input object.
034         *
035         * @param host a non-empty LRStruct.
036         * @param inp  ILambda to apply
037         *
038         * @return always null
039         */
040        public Object nonEmptyCase(LRStruct host, Object inp) {
041            ((ILambda)inp).apply(host.getFirst());
042            return host.getRest().execute(this, inp);
043        }
044    }