Skip to content

Commit b993936

Browse files
committed
StateT#zip preserves all state transformations
1 parent 435f3a5 commit b993936

File tree

3 files changed

+17
-11
lines changed

3 files changed

+17
-11
lines changed

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

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,7 @@ public <B> StateT<S, M, B> fmap(Fn1<? super A, ? extends B> fn) {
152152
*/
153153
@Override
154154
public <B> StateT<S, M, B> zip(Applicative<Fn1<? super A, ? extends B>, StateT<S, M, ?>> appFn) {
155-
return stateT(s -> runStateT(s)
156-
.zip(appFn.<StateT<S, M, Fn1<? super A, ? extends B>>>coerce()
157-
.runStateT(s)
158-
.fmap(Tuple2::_1)
159-
.fmap(f -> t -> t.biMapL(f))));
155+
return MonadT.super.zip(appFn).coerce();
160156
}
161157

162158
/**

src/test/java/com/jnape/palatable/lambda/functor/builtin/StateTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
import testsupport.traits.FunctorLaws;
1313
import testsupport.traits.MonadLaws;
1414
import testsupport.traits.MonadReaderLaws;
15-
import testsupport.traits.MonadWriterLaws;
1615
import testsupport.traits.MonadRecLaws;
16+
import testsupport.traits.MonadWriterLaws;
1717

1818
import static com.jnape.palatable.lambda.adt.Unit.UNIT;
1919
import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;

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

Lines changed: 15 additions & 5 deletions
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.adt.hlist.Tuple2;
56
import com.jnape.palatable.lambda.functor.builtin.Identity;
67
import com.jnape.palatable.traitor.annotations.TestTraits;
@@ -15,10 +16,16 @@
1516
import testsupport.traits.MonadRecLaws;
1617
import testsupport.traits.MonadWriterLaws;
1718

19+
import java.util.ArrayList;
20+
import java.util.List;
21+
1822
import static com.jnape.palatable.lambda.adt.Maybe.just;
1923
import static com.jnape.palatable.lambda.adt.Unit.UNIT;
2024
import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
2125
import static com.jnape.palatable.lambda.functor.builtin.Identity.pureIdentity;
26+
import static com.jnape.palatable.lambda.optics.functions.Set.set;
27+
import static com.jnape.palatable.lambda.optics.lenses.ListLens.elementAt;
28+
import static java.util.Arrays.asList;
2229
import static org.junit.Assert.assertEquals;
2330
import static testsupport.traits.Equivalence.equivalence;
2431

@@ -57,11 +64,14 @@ public void mapStateT() {
5764

5865
@Test
5966
public void zipping() {
60-
assertEquals(new Identity<>(tuple(4, "final state: FOO")),
61-
StateT.<String, Identity<?>>modify(s -> new Identity<>(s.toUpperCase()))
62-
.discardL(StateT.gets(s -> new Identity<>(s.length())))
63-
.flatMap(x -> StateT.stateT(s -> new Identity<>(tuple(x + 1, "final state: " + s))))
64-
.<Identity<Tuple2<Integer, String>>>runStateT("foo"));
67+
Tuple2<Unit, List<String>> result = StateT.<List<String>, Identity<?>>modify(
68+
s -> new Identity<>(set(elementAt(s.size()), just("one"), s)))
69+
.discardL(StateT.modify(s -> new Identity<>(set(elementAt(s.size()), just("two"), s))))
70+
.<Identity<Tuple2<Unit, List<String>>>>runStateT(new ArrayList<>())
71+
.runIdentity();
72+
73+
assertEquals(tuple(UNIT, asList("one", "two")),
74+
result);
6575
}
6676

6777
@Test

0 commit comments

Comments
 (0)