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