001 package listFW.visitor;
002 import listFW.*;
003
004 /**
005 * Computes a String reprsentation of IList showing a left parenthesis followed
006 * by elements of the IList separated by commas, ending with with a right parenthesis.
007 * This code has been written to make it run on any list.
008 * @stereotype visitor
009 * @author D.X. Nguyen, S. Wong
010 * @since 07/01/2004
011 * @author Mathias Ricken - Copyright 2008 - All rights reserved.
012 */
013 public class ToStringAlgo implements IListAlgo<Object, String, Object> {
014
015 public static final ToStringAlgo Singleton = new ToStringAlgo();
016 private ToStringAlgo() {
017 }
018
019 /**
020 * Returns "()".
021 */
022 public String emptyCase(IMTList<? extends Object> host, Object ... inp) {
023 return "()";
024 }
025
026 /**
027 * Passes "(" + first to the rest of IList and asks for help to complete the computation.
028 */
029 public String nonEmptyCase(INEList<? extends Object> host, Object ... inp) {
030 return host.getRest().execute(ToStringHelper.Singleton, "(" + host.getFirst());
031 }
032 }
033
034 /**
035 * Helps ToStringAlgo compute the String representation of the rest of the list.
036 */
037 class ToStringHelper implements IListAlgo<Object, String, String> {
038 public static final ToStringHelper Singleton = new ToStringHelper();
039 private ToStringHelper() {
040 }
041
042 /**
043 * Returns the accumulated String + ")".
044 * At end of list: done!
045 */
046 public String emptyCase(IMTList<? extends Object> host, String ... acc) {
047 return acc[0] + ")";
048 }
049
050 /**
051 * Continues accumulating the String representation by appending ", " + first to acc
052 * and recur!
053 */
054 public String nonEmptyCase(INEList<? extends Object> host, String ... acc) {
055 return host.getRest().execute(this, acc[0] + ", " + host.getFirst());
056 }
057 }
058