diff --git a/pom.xml b/pom.xml index 71ce011..9510b22 100644 --- a/pom.xml +++ b/pom.xml @@ -2,7 +2,7 @@ 4.0.0 fi.solita.utils functional-utils - 0.12.45 + 0.12.46 diff --git a/src/main/java/fi/solita/utils/functional/Compare.java b/src/main/java/fi/solita/utils/functional/Compare.java index e82bc40..e7e4189 100644 --- a/src/main/java/fi/solita/utils/functional/Compare.java +++ b/src/main/java/fi/solita/utils/functional/Compare.java @@ -32,7 +32,24 @@ public static final , V extends Comparable Ordering> byMap(final Comparator keyComparator, final Comparator valueComparator) { - return by(Transformers.mapEntrySet(), byIterable(by(Transformers.key(), keyComparator).then(by(Transformers.value(), valueComparator)))); + return by(Transformers.mapEntrySet(), byIterable(byEntry(keyComparator, valueComparator))); + } + + public static final Ordering> byEntry(final Comparator leftComparator, final Comparator rightComparator) { + return by(Transformers.key(), leftComparator).then(by(Transformers.value(), rightComparator)); + } + + @SuppressWarnings("unchecked") + public static final Ordering> byPair(final Comparator leftComparator, final Comparator rightComparator) { + return (Ordering>)(Object)byEntry(leftComparator, rightComparator); + } + + public static final Ordering> byTuple(final Comparator comparator1, final Comparator comparator2, final Comparator comparator3) { + return Compare.>by(Transformers._1(), comparator1).thenBy(Transformers._2(), comparator2).then(by(Transformers._3(), comparator3)); + } + + public static final Ordering> byTuple(final Comparator comparator1, final Comparator comparator2, final Comparator comparator3, final Comparator comparator4) { + return Compare.>by(Transformers._1(), comparator1).thenBy(Transformers._2(), comparator2).then(by(Transformers._3(), comparator3)).then(by(Transformers._4(), comparator4)); } /** diff --git a/src/main/java/fi/solita/utils/functional/Ordering.java b/src/main/java/fi/solita/utils/functional/Ordering.java index bb68d67..86d4bce 100644 --- a/src/main/java/fi/solita/utils/functional/Ordering.java +++ b/src/main/java/fi/solita/utils/functional/Ordering.java @@ -67,4 +67,32 @@ public final Ordering zero() { public final Ordering then(Comparator next) { return apply(Pair.of(this, Ordering.of(next))); } + + /** + * @return composition of {@code this} and transformation to an element with natural ordering. + */ + public final Ordering thenBy(final Apply> next) { + return then(Compare.by(next)); + } + + /** + * @return composition of {@code this} and transformation to an element with natural ordering. + */ + public final > Ordering thenByOption(final Apply> next) { + return then(Compare.byOption(next)); + } + + /** + * @return composition of {@code this} and {@code next} by transforming to a type comparable by {@code targetComparator}. + */ + public final Ordering thenBy(final Apply next, final Comparator targetComparator) { + return then(Compare.by(next, targetComparator)); + } + + /** + * @return composition of {@code this} and {@code next} by transforming to a type comparable by {@code targetComparator}. + */ + public final Ordering thenByOption(final Apply> next, final Comparator targetComparator) { + return then(Compare.byOption(next, targetComparator)); + } } \ No newline at end of file