forked from palatable/lambda
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathEquatableM.java
More file actions
63 lines (50 loc) · 2.01 KB
/
EquatableM.java
File metadata and controls
63 lines (50 loc) · 2.01 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package testsupport;
import com.jnape.palatable.lambda.functions.Fn1;
import com.jnape.palatable.lambda.functor.Applicative;
import com.jnape.palatable.lambda.monad.Monad;
import java.util.Objects;
public final class EquatableM<M extends Monad<?, M>, A> implements Monad<A, EquatableM<M, ?>> {
private final Monad<A, M> ma;
private final Fn1<? super M, ?> equatable;
public EquatableM(Monad<A, M> ma, Fn1<? super M, ?> equatable) {
this.ma = ma;
this.equatable = equatable;
}
@Override
public <B> EquatableM<M, B> flatMap(Fn1<? super A, ? extends Monad<B, EquatableM<M, ?>>> f) {
return new EquatableM<>(ma.flatMap(f.fmap(x -> x.<EquatableM<M, B>>coerce().ma)), equatable);
}
@Override
public <B> EquatableM<M, B> pure(B b) {
return new EquatableM<>(ma.pure(b), equatable);
}
@Override
public <B> EquatableM<M, B> fmap(Fn1<? super A, ? extends B> fn) {
return new EquatableM<>(ma.fmap(fn), equatable);
}
@Override
public <B> EquatableM<M, B> zip(Applicative<Fn1<? super A, ? extends B>, EquatableM<M, ?>> appFn) {
return new EquatableM<>(ma.zip(appFn.<EquatableM<M, Fn1<? super A, ? extends B>>>coerce().ma), equatable);
}
@Override
public <B> EquatableM<M, B> discardL(Applicative<B, EquatableM<M, ?>> appB) {
return new EquatableM<>(ma.discardL(appB.<EquatableM<M, B>>coerce().ma), equatable);
}
@Override
public <B> EquatableM<M, A> discardR(Applicative<B, EquatableM<M, ?>> appB) {
return new EquatableM<>(ma.discardR(appB.<EquatableM<M, B>>coerce().ma), equatable);
}
@Override
@SuppressWarnings("unchecked")
public boolean equals(Object other) {
if (other instanceof EquatableM<?, ?>) {
EquatableM<M, ?> that = (EquatableM<M, ?>) other;
return Objects.equals(equatable.apply((M) ma), that.equatable.apply((M) that.ma));
}
return false;
}
@Override
public int hashCode() {
return super.hashCode();
}
}