001 002 package lrs.visitor; 003 import counter.*; 004 import lrs.*; 005 006 /** 007 * Returns the nth element in a LRS. 008 */ 009 public class Nth implements IAlgo { 010 public static final Nth Singleton = new Nth(); 011 012 private Nth(){} 013 014 public Object emptyCase(LRStruct host, Object... param) 015 { 016 return (null); // No such element exists 017 } 018 019 public Object nonEmptyCase(LRStruct host, Object... param) 020 { 021 return (((ICounter) param[0]).execute(counterAlgo, host)); // 022 } 023 024 private static final ICounterAlgo counterAlgo = new ICounterAlgo() { 025 /** 026 * @param host counter to be operated on 027 * @param param LRS to be operated on 028 * @return the first element. 029 */ 030 public Object zeroCase(ICounter chost, Object... param) { 031 // param is the host of the null/nonNull cases. 032 return (((LRStruct)param[0]).getFirst ()); 033 } 034 035 /** 036 * @param host 037 * @param param 038 * @return 039 */ 040 public Object nonZeroCase(ICounter chost, Object... param) { 041 return (((LRStruct) param[0]).getRest ().execute (Nth.Singleton, chost.decrement ())); 042 } 043 }; 044 } 045