Skip to content

Commit cc0cda9

Browse files
committed
MaybeT implements MonadError
1 parent d3a049c commit cc0cda9

File tree

3 files changed

+36
-2
lines changed

3 files changed

+36
-2
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
88
### Changed
99
- `IterateT#unfold` now only computes a single `Pure` for the given input
1010
- `ReaderT#fmap` and `StateT#fmap` avoid unnecessary calls to `pure`
11+
- `MaybeT` implements `MonadError`
1112

1213
### Added
1314
- `$`, function application represented as a higher-order `Fn2`

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.jnape.palatable.lambda.monad.transformer.builtin;
22

33
import com.jnape.palatable.lambda.adt.Maybe;
4+
import com.jnape.palatable.lambda.adt.Unit;
45
import com.jnape.palatable.lambda.functions.Fn1;
56
import com.jnape.palatable.lambda.functions.recursion.RecursiveResult;
67
import com.jnape.palatable.lambda.functions.specialized.Lift;
@@ -9,13 +10,16 @@
910
import com.jnape.palatable.lambda.functor.builtin.Compose;
1011
import com.jnape.palatable.lambda.functor.builtin.Lazy;
1112
import com.jnape.palatable.lambda.monad.Monad;
13+
import com.jnape.palatable.lambda.monad.MonadError;
1214
import com.jnape.palatable.lambda.monad.MonadRec;
1315
import com.jnape.palatable.lambda.monad.transformer.MonadT;
1416

1517
import java.util.Objects;
1618

1719
import static com.jnape.palatable.lambda.adt.Maybe.just;
1820
import static com.jnape.palatable.lambda.adt.Maybe.nothing;
21+
import static com.jnape.palatable.lambda.adt.Unit.UNIT;
22+
import static com.jnape.palatable.lambda.functions.Fn0.fn0;
1923
import static com.jnape.palatable.lambda.functions.builtin.fn1.Constantly.constantly;
2024
import static com.jnape.palatable.lambda.functions.recursion.RecursiveResult.terminate;
2125

@@ -26,7 +30,7 @@
2630
* @param <A> the carrier type
2731
*/
2832
public final class MaybeT<M extends MonadRec<?, M>, A> implements
29-
MonadT<M, A, MaybeT<M, ?>, MaybeT<?, ?>> {
33+
MonadT<M, A, MaybeT<M, ?>, MaybeT<?, ?>>, MonadError<Unit, A, MaybeT<M, ?>> {
3034

3135
private final MonadRec<Maybe<A>, M> mma;
3236

@@ -67,6 +71,24 @@ public MaybeT<M, A> or(MaybeT<M, A> other) {
6771
a -> mMaybeA.pure(just(a)))));
6872
}
6973

74+
/**
75+
* {@inheritDoc}
76+
*/
77+
@Override
78+
public MaybeT<M, A> throwError(Unit unit) {
79+
return maybeT(mma.pure(nothing()));
80+
}
81+
82+
/**
83+
* {@inheritDoc}
84+
*/
85+
@Override
86+
public MaybeT<M, A> catchError(Fn1<? super Unit, ? extends Monad<A, MaybeT<M, ?>>> recoveryFn) {
87+
return maybeT(mma.flatMap(maybeA -> maybeA.match(
88+
fn0(() -> recoveryFn.apply(UNIT).<MaybeT<M, A>>coerce().runMaybeT()),
89+
a -> mma.pure(just(a)))));
90+
}
91+
7092
/**
7193
* {@inheritDoc}
7294
*/

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

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,18 @@
2222
import static com.jnape.palatable.lambda.adt.Either.right;
2323
import static com.jnape.palatable.lambda.adt.Maybe.just;
2424
import static com.jnape.palatable.lambda.adt.Maybe.nothing;
25+
import static com.jnape.palatable.lambda.adt.Unit.UNIT;
2526
import static com.jnape.palatable.lambda.functions.builtin.fn2.GT.gt;
2627
import static com.jnape.palatable.lambda.functions.builtin.fn2.LT.lt;
2728
import static com.jnape.palatable.lambda.functor.builtin.Identity.pureIdentity;
2829
import static com.jnape.palatable.lambda.functor.builtin.Lazy.lazy;
2930
import static com.jnape.palatable.lambda.io.IO.io;
30-
import static com.jnape.palatable.lambda.monad.transformer.builtin.MaybeT.*;
31+
import static com.jnape.palatable.lambda.monad.transformer.builtin.MaybeT.liftMaybeT;
32+
import static com.jnape.palatable.lambda.monad.transformer.builtin.MaybeT.maybeT;
33+
import static com.jnape.palatable.lambda.monad.transformer.builtin.MaybeT.pureMaybeT;
3134
import static com.jnape.palatable.traitor.framework.Subjects.subjects;
3235
import static org.junit.Assert.assertEquals;
36+
import static testsupport.assertion.MonadErrorAssert.assertLaws;
3337

3438
@RunWith(Traits.class)
3539
public class MaybeTTest {
@@ -41,6 +45,13 @@ public class MaybeTTest {
4145
maybeT(left("foo")));
4246
}
4347

48+
@Test
49+
public void monadError() {
50+
assertLaws(subjects(maybeT(new Identity<>(nothing())), maybeT(new Identity<>(just(1)))),
51+
UNIT,
52+
e -> maybeT(new Identity<>(just(2))));
53+
}
54+
4455
@Test
4556
public void lazyZip() {
4657
assertEquals(maybeT(right(just(2))),

0 commit comments

Comments
 (0)