Skip to content

Commit 7a30ac7

Browse files
l1cachejbgi
authored andcommitted
Added some useful functions to Equal
1 parent e0f69dc commit 7a30ac7

File tree

2 files changed

+116
-0
lines changed

2 files changed

+116
-0
lines changed

core/src/main/java/fj/Equal.java

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,74 @@ public boolean equal(B b1, B b2) {
132132
});
133133
}
134134

135+
/**
136+
* Constructs an equal instance, which tests equality of self and the mapped object in "and" manner
137+
*
138+
* @param f The function to map the original object
139+
* @param eq Equality for the mapped object
140+
* @return A new equal instance
141+
*/
142+
public final <B> Equal<A> andThen(final F<A, B> f, final Equal<B> eq) {
143+
return and(eq.contramap(f));
144+
}
145+
146+
/**
147+
* An equal instance, which executes two Equality of self in "and" manner
148+
*
149+
* @param eq Another equality for self
150+
* @return A new equal instance
151+
*/
152+
public final Equal<A> and(final Equal<A> eq) {
153+
return equalDef((a1, a2) -> def.equal(a1, a2) && eq.def.equal(a1, a2));
154+
}
155+
156+
/**
157+
* An equal instance, which executes two Equality of self in "or" manner
158+
*
159+
* @param eq Another equality for self
160+
* @return A new equal instance
161+
*/
162+
public final Equal<A> or(final Equal<A> eq) {
163+
return equalDef((a1, a2) -> def.equal(a1, a2) || eq.def.equal(a1, a2));
164+
}
165+
166+
/**
167+
* An equal instance, which reverts equality for self
168+
*
169+
* @return A new equal instance
170+
*/
171+
public final Equal<A> not() {
172+
return equalDef((a1, a2) -> !def.equal(a1, a2));
173+
}
174+
175+
/**
176+
* Static version of {@link #contramap(F)}
177+
*/
178+
public static <A, B> Equal<A> contramap(final F<A, B> f, final Equal<B> eq) {
179+
return eq.contramap(f);
180+
}
181+
182+
/**
183+
* Static version of {@link #and(Equal)}
184+
*/
185+
public static <A> Equal<A> and(final Equal<A> eq1, final Equal<A> eq2) {
186+
return eq1.and(eq2);
187+
}
188+
189+
/**
190+
* Static version of {@link #or(Equal)}
191+
*/
192+
public static <A> Equal<A> or(final Equal<A> eq1, final Equal<A> eq2) {
193+
return eq1.or(eq2);
194+
}
195+
196+
/**
197+
* Static version of {@link #not()}
198+
*/
199+
public static <A> Equal<A> not(final Equal<A> eq) {
200+
return eq.not();
201+
}
202+
135203
/**
136204
* Constructs an equal instance from the given function.
137205
*
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
package fj;
2+
3+
import org.junit.Test;
4+
5+
import static org.hamcrest.MatcherAssert.assertThat;
6+
import static org.hamcrest.core.Is.is;
7+
8+
public class EqualTest {
9+
@Test
10+
public void contramapShouldWork() {
11+
Equal<String> equalByLength = Equal.contramap(String::length, Equal.intEqual);
12+
13+
assertThat(equalByLength.eq("str1", "str2"), is(true));
14+
assertThat(equalByLength.eq("str1", "str11"), is(false));
15+
}
16+
17+
@Test
18+
public void andShouldWork() {
19+
Equal<String> equalByLengthAndLastDigit = Equal.and(Equal.contramap(String::length, Equal.intEqual),
20+
Equal.contramap(s -> s.charAt(s.length() - 1),
21+
Equal.charEqual));
22+
23+
assertThat(equalByLengthAndLastDigit.eq("str1", "spr1"), is(true));
24+
assertThat(equalByLengthAndLastDigit.eq("str1", "str2"), is(false));
25+
assertThat(equalByLengthAndLastDigit.eq("str1", "strr1"), is(false));
26+
}
27+
28+
@Test
29+
public void orShouldWork() {
30+
Equal<String> equalByLengthOrLastDigit = Equal.or(Equal.contramap(String::length, Equal.intEqual),
31+
Equal.contramap(s -> s.charAt(s.length() - 1),
32+
Equal.charEqual));
33+
34+
assertThat(equalByLengthOrLastDigit.eq("str1", "str2"), is(true));
35+
assertThat(equalByLengthOrLastDigit.eq("str1", "strr1"), is(true));
36+
assertThat(equalByLengthOrLastDigit.eq("str1", "strr2"), is(false));
37+
}
38+
39+
@Test
40+
public void thenShouldWork() {
41+
Equal<String> equalByLengthThenLastDigit = Equal.contramap(String::length, Equal.intEqual)
42+
.andThen(s -> s.charAt(s.length() - 1), Equal.charEqual);
43+
44+
assertThat(equalByLengthThenLastDigit.eq("str1", "spr1"), is(true));
45+
assertThat(equalByLengthThenLastDigit.eq("str1", "str2"), is(false));
46+
assertThat(equalByLengthThenLastDigit.eq("str1", "strr1"), is(false));
47+
}
48+
}

0 commit comments

Comments
 (0)