001 package listFW.visitor; 002 003 import listFW.*; 004 005 /** 006 * Reverses a list. The first of the varargs (input[0]) needs to be an IListFactory. 007 */ 008 public class Reverse<T> implements IListAlgo<T,IList<T>,IListFactory<T>> { 009 /** 010 * Returns the empty list. 011 * @param fac fac[0] is a list factory 012 */ 013 @SuppressWarnings("unchecked") 014 public IList<T> emptyCase(IMTList<? extends T> host, IListFactory<T>... fac) { 015 return (IList<T>)host; 016 } 017 018 /** 019 * Returns the reversed list. 020 * @param fac fac[0] is a list factory 021 */ 022 @SuppressWarnings("unchecked") 023 public IList<T> nonEmptyCase(INEList<? extends T> host, final IListFactory<T>... fac) { 024 // use a helper to do forward accumulation 025 // initial value is the empty list 026 return host.execute(new IListAlgo<T,IList<T>,IList<T>>() { 027 public IList<T> emptyCase(IMTList<? extends T> host, IList<T>... input) { 028 // return the accumulator 029 return input[0]; 030 } 031 public IList<T> nonEmptyCase(INEList<? extends T> host, IList<T>... input) { 032 // create a new NEList out of the first and the accumulator, then recur 033 return host.getRest().execute(this, 034 fac[0].makeNEList(host.getFirst(), input[0])); 035 } 036 }, fac[0].makeEmptyList()); 037 } 038 }