package com.googlecode.totallylazy.template; import com.googlecode.totallylazy.Pair; import com.googlecode.totallylazy.predicates.Predicate; import com.googlecode.totallylazy.Unchecked; import com.googlecode.totallylazy.collections.PersistentList; import java.io.IOException; import static com.googlecode.totallylazy.Pair.pair; import static com.googlecode.totallylazy.predicates.Predicates.always; import static com.googlecode.totallylazy.Unchecked.cast; import static com.googlecode.totallylazy.collections.PersistentList.constructors.list; public class CompositeRenderer implements Renderer<Object>{ private final PersistentList<Pair<Predicate<Object>, Renderer<Object>>> pairs; private CompositeRenderer(PersistentList<Pair<Predicate<Object>, Renderer<Object>>> pairs) { this.pairs = pairs; } public static CompositeRenderer compositeRenderer() { return compositeRenderer(Default.Instance); } public static CompositeRenderer compositeRenderer(Renderer<Object> defaultRenderer) { return new CompositeRenderer(list(pair(always(), defaultRenderer))); } @Override public Appendable render(Object value, Appendable appendable) throws IOException { return pairs.toSequence().find(p -> p.first().matches(value)). get().second().render(value, appendable); } public <T> CompositeRenderer add(Predicate<? super T> predicate, Renderer<? super T> renderer) { return new CompositeRenderer(pairs.cons(pair(Unchecked.<Predicate<Object>>cast(predicate), cast(renderer)))); } }