|
| 1 | +package com.jnape.palatable.lambda.functions.builtin.fn3; |
| 2 | + |
| 3 | +import com.jnape.palatable.lambda.functions.Fn3; |
| 4 | +import com.jnape.palatable.lambda.functions.builtin.fn2.CmpEq; |
| 5 | +import com.jnape.palatable.lambda.functions.specialized.BiPredicate; |
| 6 | +import com.jnape.palatable.lambda.functions.specialized.Predicate; |
| 7 | + |
| 8 | +import java.util.function.Function; |
| 9 | + |
| 10 | +/** |
| 11 | + * Given a mapping function from some type <code>A</code> to some {@link Comparable} type <code>B</code> and two values |
| 12 | + * of type <code>A</code>, return <code>true</code> if the first value is strictly equal to the second value (according |
| 13 | + * to {@link Comparable#compareTo(Object)} in terms of their mapped <code>B</code> results; otherwise, return false. |
| 14 | + * |
| 15 | + * @param <A> the value type |
| 16 | + * @param <B> the mapped comparison type |
| 17 | + * @see CmpEq |
| 18 | + * @see LTBy |
| 19 | + * @see GTBy |
| 20 | + */ |
| 21 | +public final class CmpEqBy<A, B extends Comparable<B>> implements Fn3<Function<? super A, ? extends B>, A, A, Boolean> { |
| 22 | + |
| 23 | + private static final CmpEqBy INSTANCE = new CmpEqBy(); |
| 24 | + |
| 25 | + private CmpEqBy() { |
| 26 | + } |
| 27 | + |
| 28 | + @Override |
| 29 | + public Boolean apply(Function<? super A, ? extends B> compareFn, A x, A y) { |
| 30 | + return compareFn.apply(x).compareTo(compareFn.apply(y)) == 0; |
| 31 | + } |
| 32 | + |
| 33 | + @Override |
| 34 | + public BiPredicate<A, A> apply(Function<? super A, ? extends B> compareFn) { |
| 35 | + return Fn3.super.apply(compareFn)::apply; |
| 36 | + } |
| 37 | + |
| 38 | + @Override |
| 39 | + public Predicate<A> apply(Function<? super A, ? extends B> compareFn, A x) { |
| 40 | + return Fn3.super.apply(compareFn, x)::apply; |
| 41 | + } |
| 42 | + |
| 43 | + @SuppressWarnings("unchecked") |
| 44 | + public static <A, B extends Comparable<B>> CmpEqBy<A, B> cmpEqBy() { |
| 45 | + return INSTANCE; |
| 46 | + } |
| 47 | + |
| 48 | + public static <A, B extends Comparable<B>> BiPredicate<A, A> cmpEqBy(Function<? super A, ? extends B> compareFn) { |
| 49 | + return CmpEqBy.<A, B>cmpEqBy().apply(compareFn); |
| 50 | + } |
| 51 | + |
| 52 | + public static <A, B extends Comparable<B>> Predicate<A> cmpEqBy(Function<? super A, ? extends B> compareFn, A x) { |
| 53 | + return CmpEqBy.<A, B>cmpEqBy(compareFn).apply(x); |
| 54 | + } |
| 55 | + |
| 56 | + public static <A, B extends Comparable<B>> Boolean cmpEqBy(Function<? super A, ? extends B> compareFn, A x, A y) { |
| 57 | + return cmpEqBy(compareFn, x).apply(y); |
| 58 | + } |
| 59 | +} |
0 commit comments