Skip to content

Commit c3f5652

Browse files
committed
Adding static Pure and Lift instances for IterateT
1 parent b421269 commit c3f5652

File tree

2 files changed

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

2 files changed

+46
-15
lines changed

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import com.jnape.palatable.lambda.functions.Fn1;
99
import com.jnape.palatable.lambda.functions.Fn2;
1010
import com.jnape.palatable.lambda.functions.recursion.RecursiveResult;
11+
import com.jnape.palatable.lambda.functions.specialized.Lift;
1112
import com.jnape.palatable.lambda.functions.specialized.Pure;
1213
import com.jnape.palatable.lambda.functor.Applicative;
1314
import com.jnape.palatable.lambda.functor.builtin.Lazy;
@@ -451,4 +452,29 @@ public static <A> IterateT<IO<?>, A> fromIterator(Iterator<A> as) {
451452
return nothing();
452453
}), io(() -> as));
453454
}
455+
456+
/**
457+
* The canonical {@link Pure} instance for {@link IterateT}.
458+
*
459+
* @param pureM the argument {@link Monad} {@link Pure}
460+
* @param <M> the argument {@link Monad} witness
461+
* @return the {@link Pure} instance
462+
*/
463+
public static <M extends MonadRec<?, M>> Pure<IterateT<M, ?>> pureIterateT(Pure<M> pureM) {
464+
return new Pure<IterateT<M, ?>>() {
465+
@Override
466+
public <A> IterateT<M, A> checkedApply(A a) {
467+
return liftIterateT().apply(pureM.<A, MonadRec<A, M>>apply(a));
468+
}
469+
};
470+
}
471+
472+
/**
473+
* {@link Lift} for {@link IterateT}.
474+
*
475+
* @return the {@link Monad} lifted into {@link IterateT}
476+
*/
477+
public static Lift<IterateT<?, ?>> liftIterateT() {
478+
return IterateT::singleton;
479+
}
454480
}

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

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,7 @@
1313
import com.jnape.palatable.traitor.runners.Traits;
1414
import org.junit.Test;
1515
import org.junit.runner.RunWith;
16-
import testsupport.traits.ApplicativeLaws;
17-
import testsupport.traits.Equivalence;
18-
import testsupport.traits.FunctorLaws;
19-
import testsupport.traits.MonadLaws;
20-
import testsupport.traits.MonadRecLaws;
16+
import testsupport.traits.*;
2117

2218
import java.util.ArrayList;
2319
import java.util.Collection;
@@ -34,14 +30,9 @@
3430
import static com.jnape.palatable.lambda.functions.recursion.RecursiveResult.terminate;
3531
import static com.jnape.palatable.lambda.functor.builtin.Identity.pureIdentity;
3632
import static com.jnape.palatable.lambda.functor.builtin.Lazy.lazy;
37-
import static com.jnape.palatable.lambda.functor.builtin.Writer.listen;
38-
import static com.jnape.palatable.lambda.functor.builtin.Writer.pureWriter;
39-
import static com.jnape.palatable.lambda.functor.builtin.Writer.tell;
40-
import static com.jnape.palatable.lambda.functor.builtin.Writer.writer;
33+
import static com.jnape.palatable.lambda.functor.builtin.Writer.*;
4134
import static com.jnape.palatable.lambda.io.IO.io;
42-
import static com.jnape.palatable.lambda.monad.transformer.builtin.IterateT.empty;
43-
import static com.jnape.palatable.lambda.monad.transformer.builtin.IterateT.singleton;
44-
import static com.jnape.palatable.lambda.monad.transformer.builtin.IterateT.unfold;
35+
import static com.jnape.palatable.lambda.monad.transformer.builtin.IterateT.*;
4536
import static com.jnape.palatable.lambda.monoid.builtin.AddAll.addAll;
4637
import static com.jnape.palatable.lambda.monoid.builtin.Join.join;
4738
import static com.jnape.palatable.traitor.framework.Subjects.subjects;
@@ -53,9 +44,7 @@
5344
import static org.junit.Assert.assertThat;
5445
import static testsupport.Constants.STACK_EXPLODING_NUMBER;
5546
import static testsupport.matchers.IOMatcher.yieldsValue;
56-
import static testsupport.matchers.IterateTMatcher.isEmpty;
57-
import static testsupport.matchers.IterateTMatcher.iterates;
58-
import static testsupport.matchers.IterateTMatcher.iteratesAll;
47+
import static testsupport.matchers.IterateTMatcher.*;
5948
import static testsupport.traits.Equivalence.equivalence;
6049

6150
@RunWith(Traits.class)
@@ -242,4 +231,20 @@ public void concatIsStackSafe() {
242231
assertEquals(new Identity<>(10_000),
243232
bigIterateT.fold((x, y) -> new Identity<>(x + y), new Identity<>(0)));
244233
}
234+
235+
@Test
236+
public void staticPure() {
237+
assertEquals(new Identity<>(singletonList(1)),
238+
pureIterateT(pureIdentity())
239+
.<Integer, IterateT<Identity<?>, Integer>>apply(1)
240+
.<List<Integer>, Identity<List<Integer>>>toCollection(ArrayList::new));
241+
}
242+
243+
@Test
244+
public void staticLift() {
245+
assertEquals(new Identity<>(singletonList(1)),
246+
liftIterateT()
247+
.<Integer, Identity<?>, IterateT<Identity<?>, Integer>>apply(new Identity<>(1))
248+
.<List<Integer>, Identity<List<Integer>>>toCollection(ArrayList::new));
249+
}
245250
}

0 commit comments

Comments
 (0)