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 }