package com.smartcodeltd.jenkinsci.plugins.buildmonitor.readability; import java.util.List; import static java.lang.String.format; public class Lister { private static final String DEFAULT_NO_ITEMS_TEMPLATE = "%s"; public static <T> String describe(String pluralTemplate, List<T> items) { return describe(DEFAULT_NO_ITEMS_TEMPLATE, pluralTemplate, items); } public static <T> String describe(String noItemsTemplate, String pluralTemplate, List<T> items) { return describe(noItemsTemplate, pluralTemplate, pluralTemplate, items); } public static <T> String describe(String noItemsTemplate, String singularTemplate, String pluralTemplate, List<T> items) { switch (items.size()) { case 0: return formatted(noItemsTemplate, items); case 1: return formatted(singularTemplate, items); default: return formatted(pluralTemplate, items); } } public static <T> String asString(List<T> items) { return items.isEmpty() ? "" : asString(headOf(items), restOf(items)); } // -- private static <T> String formatted(String template, List<T> items) { return format(template, asString(items)); } private static <T> String asString(String acc, List<T> tail) { switch(tail.size()) { case 0: return acc; case 1: return and(acc, headOf(tail)); default: return asString(comma(acc, headOf(tail)), restOf(tail)); } } private static String and(String first, String second) { return format("%s and %s", first, second); } private static String comma(String first, String second) { return format("%s, %s", first, second); } private static <T> String headOf(List<T> items) { return items.get(0).toString(); } private static <T> List<T> restOf(List<T> items) { return items.subList(1, items.size()); } }