001    package lrs.visitor;
002    
003    import lrs.*;
004    import counter.*;
005    import fp.*;
006    
007    public class LRSSumLambdaN implements IAlgo {
008      public static final LRSSumLambdaN Singleton = new LRSSumLambdaN();
009      
010      private LRSSumLambdaN(){ }
011      
012    //  private final ICounterAlgo helper = new ICounterAlgo() {
013    //    public Object zeroCase(ICounter cHost, Object... h) {
014    //      return 0.0;
015    //    }
016    //    
017    //    public Object nonZeroCase(ICounter cHost, Object... h){
018    //      return ((Number)((ILambda)((LRStruct)h[0]).getFirst()).apply(h[1])).doubleValue() + ((Double)((LRStruct)h[0]).getRest().execute(LRSSumLambdaN.this, cHost.decrement(), h[1]));
019    //    }
020    //  };
021      
022      
023      public Object emptyCase(LRStruct host, Object... param) {
024        return 0.0;
025      }
026      
027      public Object nonEmptyCase(LRStruct host, final Object... param){
028        
029        return  ((ICounter) param[0]).execute(new ICounterAlgo() {
030          ICounterAlgo counterHelper = this;
031          
032          IAlgo listHelper = new IAlgo() {
033            public Object emptyCase(LRStruct h, Object... c) {
034              return c[1];
035            }
036            public Object nonEmptyCase(LRStruct h, final Object... c){
037              return ((ICounter) c[0]).execute(counterHelper, h, c[1]);
038            }
039          };
040          
041          public Object zeroCase(ICounter cHost, Object... h) {
042            return h[1];
043          }      
044          public Object nonZeroCase(ICounter cHost, Object... h){
045            return  ((LRStruct)h[0]).getRest().execute(listHelper, cHost.decrement(), 
046                                                       ((Number)((ILambda)((LRStruct)h[0]).getFirst()).apply(param[1])).doubleValue()
047                                                         +((Number)h[1]).doubleValue());
048          }
049        }, host, 0.0);
050      }  
051    }