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