Skip to content

Commit 8814a68

Browse files
committed
IterateT#unfold now only constructs one Pure instance at invocation time
1 parent 0643bc4 commit 8814a68

File tree

1 file changed

+10
-7
lines changed
  • src/main/java/com/jnape/palatable/lambda/monad/transformer/builtin

1 file changed

+10
-7
lines changed

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

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@
2929
import static com.jnape.palatable.lambda.adt.choice.Choice2.a;
3030
import static com.jnape.palatable.lambda.adt.choice.Choice2.b;
3131
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.$.$;
3234
import static com.jnape.palatable.lambda.functions.builtin.fn2.Into.into;
3335
import static com.jnape.palatable.lambda.functions.builtin.fn2.Tupler2.tupler;
3436
import static com.jnape.palatable.lambda.functions.builtin.fn3.FoldLeft.foldLeft;
@@ -74,10 +76,10 @@ private IterateT(Pure<M> pureM,
7476
ImmutableQueue<MonadRec<A, M>> conses,
7577
ImmutableQueue<Choice2<Fn0<MonadRec<Maybe<Tuple2<A, IterateT<M, A>>>, M>>, IterateT<M, A>>> middles,
7678
ImmutableQueue<MonadRec<A, M>> snocs) {
77-
this.pureM = pureM;
78-
this.conses = conses;
79+
this.pureM = pureM;
80+
this.conses = conses;
7981
this.middles = middles;
80-
this.snocs = snocs;
82+
this.snocs = snocs;
8183
}
8284

8385
/**
@@ -220,7 +222,7 @@ public <B> IterateT<M, B> fmap(Fn1<? super A, ? extends B> fn) {
220222
*/
221223
@Override
222224
public <B> IterateT<M, B> pure(B b) {
223-
return singleton(runIterateT().pure(b));
225+
return singleton(pureM.<B, MonadRec<B, M>>apply(b));
224226
}
225227

226228
/**
@@ -413,9 +415,10 @@ public static <M extends MonadRec<?, M>, A> IterateT<M, A> of(
413415
*/
414416
public static <M extends MonadRec<?, M>, A, B> IterateT<M, A> unfold(
415417
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);
419422
}
420423

421424
/**

0 commit comments

Comments
 (0)