001    
002    package lrs.visitor;
003    
004    import counter.*;
005    import lrs.*;
006    
007    public class NthCdr implements IAlgo {
008      
009      public static final NthCdr Singleton = new NthCdr();
010      private NthCdr() {}
011      
012      /**
013       * @param host LRS to be operated on
014       * @param param A counter object
015       */
016      public Object emptyCase(LRStruct host, Object... param) {
017        return(host);
018      }
019      
020      /**
021       * @param host LRS to be operated on
022       * @param param A counter object
023       */
024      public Object nonEmptyCase(LRStruct host, Object... param) {
025        return( ((ICounter) param[0]).execute(counterAlgo, host) );
026      }
027      
028      private static final ICounterAlgo counterAlgo = new ICounterAlgo() {
029        /**
030         * @param host counter to be operated on
031         * @param param LRS to be operated on
032         */
033        public Object zeroCase(ICounter chost, Object... param) {
034          // param is the host of the null/nonNull cases.
035          return(param[0]);
036        }
037        
038        /**
039         * @param host counter to be operated on
040         * @param param LRS to be operated on
041         */
042        public Object nonZeroCase(ICounter chost, Object... param) {
043          return( ((LRStruct) param[0]).getRest().execute(NthCdr.Singleton, chost.decrement()) );
044        }
045      };  
046    }