Skip to content

Commit 9e238bf

Browse files
committed
EitherT exposes the nested Either's bifunctor properties
1 parent 585c164 commit 9e238bf

2 files changed

Lines changed: 31 additions & 2 deletions

File tree

  • src
    • main/java/com/jnape/palatable/lambda/monad/transformer/builtin
    • test/java/com/jnape/palatable/lambda/monad/transformer/builtin

src/main/java/com/jnape/palatable/lambda/monad/transformer/builtin/EitherT.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import com.jnape.palatable.lambda.adt.Either;
44
import com.jnape.palatable.lambda.functions.Fn1;
55
import com.jnape.palatable.lambda.functor.Applicative;
6+
import com.jnape.palatable.lambda.functor.Bifunctor;
67
import com.jnape.palatable.lambda.functor.builtin.Compose;
78
import com.jnape.palatable.lambda.functor.builtin.Lazy;
89
import com.jnape.palatable.lambda.monad.Monad;
@@ -20,7 +21,9 @@
2021
* @param <L> the left type
2122
* @param <R> the right type
2223
*/
23-
public final class EitherT<M extends Monad<?, M>, L, R> implements MonadT<M, Either<L, ?>, R> {
24+
public final class EitherT<M extends Monad<?, M>, L, R> implements
25+
Bifunctor<L, R, EitherT<M, ?, ?>>,
26+
MonadT<M, Either<L, ?>, R> {
2427

2528
private final Monad<Either<L, R>, M> melr;
2629

@@ -100,6 +103,31 @@ public <B> EitherT<M, L, R> discardR(Applicative<B, MonadT<M, Either<L, ?>, ?>>
100103
return MonadT.super.discardR(appB).coerce();
101104
}
102105

106+
/**
107+
* {@inheritDoc}
108+
*/
109+
@Override
110+
public <L2, R2> EitherT<M, L2, R2> biMap(Fn1<? super L, ? extends L2> lFn,
111+
Fn1<? super R, ? extends R2> rFn) {
112+
return eitherT(melr.fmap(e -> e.biMap(lFn, rFn)));
113+
}
114+
115+
/**
116+
* {@inheritDoc}
117+
*/
118+
@Override
119+
public <L2> EitherT<M, L2, R> biMapL(Fn1<? super L, ? extends L2> fn) {
120+
return (EitherT<M, L2, R>) Bifunctor.super.<L2>biMapL(fn);
121+
}
122+
123+
/**
124+
* {@inheritDoc}
125+
*/
126+
@Override
127+
public <R2> EitherT<M, L, R2> biMapR(Fn1<? super R, ? extends R2> fn) {
128+
return (EitherT<M, L, R2>) Bifunctor.super.<R2>biMapR(fn);
129+
}
130+
103131
@Override
104132
public boolean equals(Object other) {
105133
return other instanceof EitherT<?, ?, ?> && Objects.equals(melr, ((EitherT<?, ?, ?>) other).melr);

src/test/java/com/jnape/palatable/lambda/monad/transformer/builtin/EitherTTest.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import org.junit.Test;
88
import org.junit.runner.RunWith;
99
import testsupport.traits.ApplicativeLaws;
10+
import testsupport.traits.BifunctorLaws;
1011
import testsupport.traits.FunctorLaws;
1112
import testsupport.traits.MonadLaws;
1213

@@ -22,7 +23,7 @@
2223
@RunWith(Traits.class)
2324
public class EitherTTest {
2425

25-
@TestTraits({FunctorLaws.class, ApplicativeLaws.class, MonadLaws.class})
26+
@TestTraits({FunctorLaws.class, ApplicativeLaws.class, MonadLaws.class, BifunctorLaws.class})
2627
public Subjects<EitherT<Identity<?>, String, Integer>> testSubject() {
2728
return subjects(eitherT(new Identity<>(left("foo"))), eitherT(new Identity<>(right(1))));
2829
}

0 commit comments

Comments
 (0)