Skip to content

Commit 1a84d0f

Browse files
7h3kk1djnape
authored andcommitted
Added MonadError instance to EitherT
1 parent 4111f73 commit 1a84d0f

File tree

2 files changed

+34
-1
lines changed
  • src
    • main/java/com/jnape/palatable/lambda/monad/transformer/builtin
    • test/java/com/jnape/palatable/lambda/monad/transformer/builtin

2 files changed

+34
-1
lines changed

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

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import com.jnape.palatable.lambda.functor.builtin.Compose;
1111
import com.jnape.palatable.lambda.functor.builtin.Lazy;
1212
import com.jnape.palatable.lambda.monad.Monad;
13+
import com.jnape.palatable.lambda.monad.MonadError;
1314
import com.jnape.palatable.lambda.monad.MonadRec;
1415
import com.jnape.palatable.lambda.monad.transformer.MonadT;
1516

@@ -28,7 +29,8 @@
2829
*/
2930
public final class EitherT<M extends MonadRec<?, M>, L, R> implements
3031
Bifunctor<L, R, EitherT<M, ?, ?>>,
31-
MonadT<M, R, EitherT<M, L, ?>, EitherT<?, L, ?>> {
32+
MonadT<M, R, EitherT<M, L, ?>, EitherT<?, L, ?>>,
33+
MonadError<L, R, EitherT<M, L, ?>> {
3234

3335
private final MonadRec<Either<L, R>, M> melr;
3436

@@ -120,6 +122,24 @@ public <B> EitherT<M, L, R> discardR(Applicative<B, EitherT<M, L, ?>> appB) {
120122
return MonadT.super.discardR(appB).coerce();
121123
}
122124

125+
/**
126+
* {@inheritDoc}
127+
*/
128+
@Override
129+
public EitherT<M, L, R> throwError(L l) {
130+
return eitherT(melr.pure(left(l)));
131+
}
132+
133+
/**
134+
* {@inheritDoc}
135+
*/
136+
@Override
137+
public EitherT<M, L, R> catchError(Fn1<? super L, ? extends Monad<R, EitherT<M, L, ?>>> recoveryFn) {
138+
return eitherT(runEitherT().flatMap(e -> e.match(
139+
l -> recoveryFn.apply(l).<EitherT<M, L, R>>coerce().runEitherT(),
140+
r -> melr.pure(r).fmap(Either::right))));
141+
}
142+
123143
/**
124144
* {@inheritDoc}
125145
*/

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import com.jnape.palatable.lambda.adt.Either;
44
import com.jnape.palatable.lambda.adt.Unit;
5+
import com.jnape.palatable.lambda.functions.specialized.Pure;
56
import com.jnape.palatable.lambda.functor.builtin.Identity;
67
import com.jnape.palatable.lambda.io.IO;
78
import com.jnape.palatable.traitor.annotations.TestTraits;
@@ -27,6 +28,7 @@
2728
import static com.jnape.palatable.lambda.io.IO.io;
2829
import static com.jnape.palatable.lambda.monad.transformer.builtin.EitherT.eitherT;
2930
import static com.jnape.palatable.lambda.monad.transformer.builtin.EitherT.liftEitherT;
31+
import static com.jnape.palatable.lambda.monad.transformer.builtin.EitherT.pureEitherT;
3032
import static com.jnape.palatable.traitor.framework.Subjects.subjects;
3133
import static org.junit.Assert.assertEquals;
3234

@@ -73,4 +75,15 @@ public void staticPure() {
7375
.apply(1);
7476
assertEquals(eitherT(new Identity<>(right(1))), eitherT);
7577
}
78+
79+
@Test
80+
public void monadError() {
81+
Pure<EitherT<Identity<?>, String, ?>> pure = pureEitherT(pureIdentity());
82+
83+
assertEquals(eitherT(new Identity<>(left("Hello"))),
84+
pure.<Integer, EitherT<Identity<?>, String, Integer>>apply(1).throwError("Hello"));
85+
assertEquals(pure.apply(5),
86+
EitherT.<Identity<?>, String, Integer>eitherT(new Identity<>(left("Hello")))
87+
.catchError(s -> pure.apply(s.length())));
88+
}
7689
}

0 commit comments

Comments
 (0)