001    
002    package lrs.visitor;
003    
004    import lrs.*;
005    import counter.*;
006    public class LRSTrim implements IAlgo {
007      public static final LRSTrim Singleton = new LRSTrim();
008      private LRSTrim() {}
009      
010      public Object emptyCase(LRStruct host, Object... param) {
011        return(null);
012      }
013      
014      public Object nonEmptyCase(LRStruct host, Object... param) {
015        return( ((ICounter) param[0]).execute(counterAlgo, host));
016        
017      }
018      
019      /**
020       * Helper algo for the ICounter
021       */
022      private static final ICounterAlgo counterAlgo  = new ICounterAlgo() {
023        public Object zeroCase(ICounter chost, Object... param) {
024          ((LRStruct)param[0]).setRest(new LRStruct());
025          ((LRStruct)param[0]).removeFront();
026          return(null);
027        }
028        
029        public Object nonZeroCase(ICounter chost, Object... param) {
030          return ((LRStruct) param[0]).getRest().execute(LRSTrim.Singleton,chost.decrement());  // recurse on the rest of the list
031        }
032      };
033    } 
034