001    package lrs.visitor;
002    
003    import counter.*;
004    import lrs.*;
005    
006    /**
007     * Removes and returns the nth element in a LRS.
008     */
009    public class RemoveNth implements IAlgo{
010      
011      public static RemoveNth Singleton = new RemoveNth();
012      
013      private RemoveNth(){}
014      
015      private static final ICounterAlgo counterAlgo = new ICounterAlgo() {
016        /**
017         * @param host 
018         * @param param 
019         * @return 
020         */
021        public Object zeroCase(ICounter host, Object... param) {
022          // param is the host of the null/nonNull cases.
023          return (((LRStruct)param[0]).removeFront ());
024        }
025        
026        /**
027         * @param host 
028         * @param param 
029         * @return 
030         */
031        public Object nonZeroCase(ICounter host, Object... param) {
032          return (((LRStruct) param[0]).getRest ().execute (RemoveNth.Singleton, host.decrement ()));
033        }
034      };
035      
036      /**
037       * @param host 
038       * @param param 
039       * @return 
040       */
041      public Object emptyCase(LRStruct host, Object... param) {
042        return (null); // No such element exists.
043      }
044      
045      /**
046       * @param host 
047       * @param param 
048       * @return 
049       */
050      public Object nonEmptyCase(LRStruct host, Object... param) {
051        return (((ICounter) param[0]).execute(counterAlgo, host)); //
052      }  
053    }
054