public static S join(S glue, Iterable strings) { if (strings == null) ret ""; if (strings cast Collection) { if (strings.size() == 1) ret strOrEmpty(first(strings)); } new StringBuilder buf; Iterator i = strings.iterator(); if (i.hasNext()) { buf.append(strOrEmpty(i.next())); while (i.hasNext()) buf.append(glue).append(strOrEmpty(i.next())); } ret buf.toString(); } public static S join(S glue, S... strings) { ret join(glue, Arrays.asList(strings)); } public static S join(S glue, O... strings) { ret join(glue, Arrays.asList(strings)); } static S join(Iterable strings) { ret join("", strings); } static S join(Iterable strings, S glue) { ret join(glue, strings); } public static S join(String[] strings) { ret join("", strings); } ifclass Pair static S join(S glue, Pair p) { ret p == null ? "" : str(p.a) + glue + str(p.b); } endif