001    package lrs.visitor;
002    
003    import lrs.IAlgo;
004    import lrs.LRStruct;
005    
006    /**
007     * Return the n'th element in the list.
008     *
009     * @author Mathias Ricken
010     */
011    public class GetNth implements IAlgo {
012        /// singleton instance
013        public static final GetNth Singleton = new GetNth();
014    
015        /// private singleton ctor
016        private GetNth() {
017        }
018    
019        /**
020         * Operates on an empty LRStruct host, given an input object.
021         *
022         * @param host an empty LRStruct.
023         * @param inp  index of element
024         *
025         * @return nothing
026         *
027         * @throws IllegalArgumentException
028         */
029        public Object emptyCase(LRStruct host, Object inp) {
030            throw new IllegalArgumentException("LRStruct empty");
031        }
032    
033        /**
034         * Operates on a non-empty LRStruct host, given an input object.
035         *
036         * @param host a non-empty LRStruct.
037         * @param inp  index of element
038         *
039         * @return an n'th element
040         */
041        public Object nonEmptyCase(LRStruct host, Object inp) {
042            int i = ((Integer)inp).intValue();
043            if (0 == i) {
044                return host.getFirst();
045            }
046            else {
047                return host.getRest().execute(this, new Integer(i - 1));
048            }
049        }
050    }