Skip to content

Commit ad16a75

Browse files
nomicfluxjnape
authored andcommitted
MonadRec implementation for Choice5
1 parent ae94ce6 commit ad16a75

File tree

2 files changed

+34
-16
lines changed

2 files changed

+34
-16
lines changed

src/main/java/com/jnape/palatable/lambda/adt/choice/Choice5.java

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,20 @@
66
import com.jnape.palatable.lambda.adt.hlist.HList;
77
import com.jnape.palatable.lambda.adt.hlist.Tuple5;
88
import com.jnape.palatable.lambda.functions.Fn1;
9+
import com.jnape.palatable.lambda.functions.recursion.RecursiveResult;
910
import com.jnape.palatable.lambda.functions.specialized.Pure;
1011
import com.jnape.palatable.lambda.functor.Applicative;
1112
import com.jnape.palatable.lambda.functor.Bifunctor;
1213
import com.jnape.palatable.lambda.functor.builtin.Lazy;
1314
import com.jnape.palatable.lambda.monad.Monad;
15+
import com.jnape.palatable.lambda.monad.MonadRec;
1416
import com.jnape.palatable.lambda.traversable.Traversable;
1517

1618
import java.util.Objects;
1719

1820
import static com.jnape.palatable.lambda.functions.builtin.fn2.Into5.into5;
21+
import static com.jnape.palatable.lambda.functions.recursion.RecursiveResult.terminate;
22+
import static com.jnape.palatable.lambda.functions.recursion.Trampoline.trampoline;
1923
import static com.jnape.palatable.lambda.functor.builtin.Lazy.lazy;
2024

2125
/**
@@ -31,7 +35,7 @@
3135
*/
3236
public abstract class Choice5<A, B, C, D, E> implements
3337
CoProduct5<A, B, C, D, E, Choice5<A, B, C, D, E>>,
34-
Monad<E, Choice5<A, B, C, D, ?>>,
38+
MonadRec<E, Choice5<A, B, C, D, ?>>,
3539
Bifunctor<D, E, Choice5<A, B, C, ?, ?>>,
3640
Traversable<E, Choice5<A, B, C, D, ?>> {
3741

@@ -70,7 +74,7 @@ public Choice4<A, B, C, D> converge(Fn1<? super E, ? extends CoProduct4<A, B, C,
7074
*/
7175
@Override
7276
public <F> Choice5<A, B, C, D, F> fmap(Fn1<? super E, ? extends F> fn) {
73-
return Monad.super.<F>fmap(fn).coerce();
77+
return MonadRec.super.<F>fmap(fn).coerce();
7478
}
7579

7680
/**
@@ -111,7 +115,7 @@ public <F> Choice5<A, B, C, D, F> pure(F f) {
111115
*/
112116
@Override
113117
public <F> Choice5<A, B, C, D, F> zip(Applicative<Fn1<? super E, ? extends F>, Choice5<A, B, C, D, ?>> appFn) {
114-
return Monad.super.zip(appFn).coerce();
118+
return MonadRec.super.zip(appFn).coerce();
115119
}
116120

117121
/**
@@ -132,15 +136,15 @@ public <F> Lazy<Choice5<A, B, C, D, F>> lazyZip(
132136
*/
133137
@Override
134138
public <F> Choice5<A, B, C, D, F> discardL(Applicative<F, Choice5<A, B, C, D, ?>> appB) {
135-
return Monad.super.discardL(appB).coerce();
139+
return MonadRec.super.discardL(appB).coerce();
136140
}
137141

138142
/**
139143
* {@inheritDoc}
140144
*/
141145
@Override
142146
public <F> Choice5<A, B, C, D, E> discardR(Applicative<F, Choice5<A, B, C, D, ?>> appB) {
143-
return Monad.super.discardR(appB).coerce();
147+
return MonadRec.super.discardR(appB).coerce();
144148
}
145149

146150
/**
@@ -151,6 +155,23 @@ public <F> Choice5<A, B, C, D, F> flatMap(Fn1<? super E, ? extends Monad<F, Choi
151155
return match(Choice5::a, Choice5::b, Choice5::c, Choice5::d, e -> f.apply(e).coerce());
152156
}
153157

158+
/**
159+
* {@inheritDoc}
160+
*/
161+
@Override
162+
public <F> Choice5<A, B, C, D, F> trampolineM(Fn1<? super E, ? extends MonadRec<RecursiveResult<E, F>, Choice5<A, B, C, D, ?>>> fn) {
163+
return match(Choice5::a,
164+
Choice5::b,
165+
Choice5::c,
166+
Choice5::d,
167+
trampoline(e -> fn.apply(e).<Choice5<A, B, C, D, RecursiveResult<E, F>>>coerce().match(
168+
a -> terminate(Choice5.a(a)),
169+
b -> terminate(Choice5.b(b)),
170+
c -> terminate(Choice5.c(c)),
171+
d -> terminate(Choice5.d(d)),
172+
eRec -> eRec.fmap(Choice5::e))));
173+
}
174+
154175
/**
155176
* {@inheritDoc}
156177
*/

src/test/java/com/jnape/palatable/lambda/adt/choice/Choice5Test.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,9 @@
66
import org.junit.Before;
77
import org.junit.Test;
88
import org.junit.runner.RunWith;
9-
import testsupport.traits.ApplicativeLaws;
10-
import testsupport.traits.BifunctorLaws;
11-
import testsupport.traits.FunctorLaws;
12-
import testsupport.traits.MonadLaws;
13-
import testsupport.traits.TraversableLaws;
9+
import testsupport.traits.*;
1410

15-
import static com.jnape.palatable.lambda.adt.choice.Choice5.a;
16-
import static com.jnape.palatable.lambda.adt.choice.Choice5.b;
17-
import static com.jnape.palatable.lambda.adt.choice.Choice5.c;
18-
import static com.jnape.palatable.lambda.adt.choice.Choice5.d;
19-
import static com.jnape.palatable.lambda.adt.choice.Choice5.e;
11+
import static com.jnape.palatable.lambda.adt.choice.Choice5.*;
2012
import static com.jnape.palatable.lambda.functor.builtin.Lazy.lazy;
2113
import static com.jnape.palatable.traitor.framework.Subjects.subjects;
2214
import static org.junit.Assert.assertEquals;
@@ -39,7 +31,12 @@ public void setUp() {
3931
e = e('z');
4032
}
4133

42-
@TestTraits({FunctorLaws.class, ApplicativeLaws.class, MonadLaws.class, BifunctorLaws.class, TraversableLaws.class})
34+
@TestTraits({FunctorLaws.class,
35+
ApplicativeLaws.class,
36+
MonadLaws.class,
37+
BifunctorLaws.class,
38+
TraversableLaws.class,
39+
MonadRecLaws.class})
4340
public Subjects<Choice5<String, Integer, Boolean, Character, Double>> testSubjects() {
4441
return subjects(Choice5.a("foo"), Choice5.b(1), Choice5.c(true), Choice5.d('a'), Choice5.e(2d));
4542
}

0 commit comments

Comments
 (0)