001    package lrs.visitor;
002    
003    import lrs.*;
004    import counter.*;
005    
006    public class LRSSumN implements IAlgo {
007      public static final LRSSumN Singleton = new LRSSumN();
008      
009      private LRSSumN(){ }
010      
011      private final ICounterAlgo helper = new ICounterAlgo() {
012        public Object zeroCase(ICounter cHost, Object... h) {
013          return 0.0;
014        }
015        
016        public Object nonZeroCase(ICounter cHost, Object... h){
017          return ((Number)((LRStruct)h[0]).getFirst()).doubleValue() + ((Double)((LRStruct)h[0]).getRest().execute(LRSSumN.this, cHost.decrement()));
018        }
019      };
020      
021      public Object emptyCase(LRStruct host, Object... param) {
022        return 0.0;
023      }
024      
025      public Object nonEmptyCase(LRStruct host, Object... param){
026        return  ((ICounter) param[0]).execute(helper, host);
027      }  
028    }
029