001    package listFW.visitor;
002    
003    import listFW.*;
004    
005    /**
006     * Attempt to reverse any kind of list, but requires that the factory match the list
007     * Could have serious problems at run-time due to type erasure
008     * @author Mathias Ricken - Copyright 2008 - All rights reserved.
009     */
010    public class ReverseList3 implements IListAlgo<Object,IList<? extends Object>, IListFactory<?>>  {
011        public IMTList<? extends Object> emptyCase(IMTList<? extends Object> host, IListFactory<?> ... fac) {
012            return fac[0].makeEmptyList();
013        }
014        @SuppressWarnings("unchecked")
015        public INEList<? extends Object> nonEmptyCase(INEList<? extends Object> host, IListFactory<?> ... fac) {
016            final IListFactory<Object> f = (IListFactory<Object>)fac[0];
017            return host.getRest().execute(new IListAlgo<Object,INEList<Object>, INEList<Object>>()  {
018                public INEList<Object> emptyCase(IMTList<? extends Object> h, INEList<Object> ... acc) {
019                    return acc[0];
020                }
021                public INEList<Object> nonEmptyCase(INEList<? extends Object> h, INEList<Object>... acc) {
022                    return h.getRest().execute(this, f.makeNEList(h.getFirst(), acc[0]));
023                }
024            },f.makeNEList(host.getFirst(), f.makeEmptyList()));
025        }
026    }
027    
028