|
29 | 29 | import static com.jnape.palatable.lambda.adt.choice.Choice2.a;
|
30 | 30 | import static com.jnape.palatable.lambda.adt.choice.Choice2.b;
|
31 | 31 | import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
|
| 32 | +import static com.jnape.palatable.lambda.functions.Fn1.withSelf; |
| 33 | +import static com.jnape.palatable.lambda.functions.builtin.fn2.$.$; |
32 | 34 | import static com.jnape.palatable.lambda.functions.builtin.fn2.Into.into;
|
33 | 35 | import static com.jnape.palatable.lambda.functions.builtin.fn2.Tupler2.tupler;
|
34 | 36 | import static com.jnape.palatable.lambda.functions.builtin.fn3.FoldLeft.foldLeft;
|
@@ -74,10 +76,10 @@ private IterateT(Pure<M> pureM,
|
74 | 76 | ImmutableQueue<MonadRec<A, M>> conses,
|
75 | 77 | ImmutableQueue<Choice2<Fn0<MonadRec<Maybe<Tuple2<A, IterateT<M, A>>>, M>>, IterateT<M, A>>> middles,
|
76 | 78 | ImmutableQueue<MonadRec<A, M>> snocs) {
|
77 |
| - this.pureM = pureM; |
78 |
| - this.conses = conses; |
| 79 | + this.pureM = pureM; |
| 80 | + this.conses = conses; |
79 | 81 | this.middles = middles;
|
80 |
| - this.snocs = snocs; |
| 82 | + this.snocs = snocs; |
81 | 83 | }
|
82 | 84 |
|
83 | 85 | /**
|
@@ -220,7 +222,7 @@ public <B> IterateT<M, B> fmap(Fn1<? super A, ? extends B> fn) {
|
220 | 222 | */
|
221 | 223 | @Override
|
222 | 224 | public <B> IterateT<M, B> pure(B b) {
|
223 |
| - return singleton(runIterateT().pure(b)); |
| 225 | + return singleton(pureM.<B, MonadRec<B, M>>apply(b)); |
224 | 226 | }
|
225 | 227 |
|
226 | 228 | /**
|
@@ -413,9 +415,10 @@ public static <M extends MonadRec<?, M>, A> IterateT<M, A> of(
|
413 | 415 | */
|
414 | 416 | public static <M extends MonadRec<?, M>, A, B> IterateT<M, A> unfold(
|
415 | 417 | Fn1<? super B, ? extends MonadRec<Maybe<Tuple2<A, B>>, M>> fn, MonadRec<B, M> mb) {
|
416 |
| - return suspended(() -> maybeT(mb.flatMap(fn)) |
417 |
| - .fmap(ab -> ab.fmap(b -> unfold(fn, mb.pure(b)))) |
418 |
| - .runMaybeT(), Pure.of(mb)); |
| 418 | + Pure<M> pureM = Pure.of(mb); |
| 419 | + return $(withSelf((self, mmb) -> suspended(() -> maybeT(mmb.flatMap(fn)) |
| 420 | + .fmap(ab -> ab.<IterateT<M, A>>fmap(b -> self.apply(pureM.apply(b)))) |
| 421 | + .runMaybeT(), pureM)), mb); |
419 | 422 | }
|
420 | 423 |
|
421 | 424 | /**
|
|
0 commit comments