package pt.isel.mpd.util; import java.util.Comparator; import java.util.function.Function; /** * Created by mcarvalho on 30-04-2015. */ class ReversableCmp<T, R extends Comparable<R>> implements Comparator<T> { private final Function<T, R> sup; public ReversableCmp(Function<T, R> sup) { this.sup = sup; } @Override public int compare(T o1, T o2) { return sup.apply(o1).compareTo(sup.apply(o2)); } @Override public Comparator<T> reversed() { return (o1, o2) -> compare(o2, o1); } public <R2 extends Comparable<R2>> ReversableCmp<T, R2> andThen(Function<T, R2> sup2) { ReversableCmp cmp2 = new ReversableCmp(sup2); return new ReversableCmp<T, R2>(sup2){ @Override public int compare(T o1, T o2) { int res = ReversableCmp.this.compare(o1, o2); return res != 0? res : cmp2.compare(o1, o2); } }; } }