001 package lrs.visitor;
002
003 import lrs.*;
004 import logic.*;
005
006 /**
007 * An algortihm on a LRStruct that will skip over all the leading multiples of the supplied value.
008 * The return value is the sub-list (a LRStruct) whose leading term is the first occurence of a
009 * non-multiple of the given value. Here the supplied value is assumed to be an Integer.
010 */
011 public class SkipLeadMods implements IAlgo {
012 public static SkipLeadMods Singleton = new SkipLeadMods();
013 private SkipLeadMods(){}
014
015
016 /**
017 * No multiples to be found in the empty list, so the list is returned.
018 * @param host
019 * @param param
020 * @return
021 */
022 public Object emptyCase(LRStruct host, Object... param)
023 {
024 return (host); // NYI
025 }
026
027 /**
028 * Recursively searches for the first non-multiple of the given value (in param).
029 * @param host
030 * @param param
031 * @return
032 */
033 public Object nonEmptyCase(final LRStruct host, final Object... param)
034 {
035 return BooleanFactory.Singleton.makeBoolean(((Integer) host.getFirst()) > ((Integer) param[0])).
036 execute( new IBooleanAlgo() {
037 public Object trueCase(IBoolean h, Object... inp) {;
038 return (host); // found the next one!
039 }
040 public Object falseCase(IBoolean h, Object... inp) {
041 return (host.getRest().execute (SkipLeadMods.this, param)); // keep looking, so recurse
042 }
043 });
044
045 // if (((Integer) host.getFirst ()).intValue () % ((Integer)param[0]).intValue () != 0)
046 // {
047 // return (host); // found the next one!
048 // }
049 // else
050 // {
051 // return (host.getRest().execute (this, param)); // keep looking, so recurse
052 // }
053 }
054 }
055