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 }