Skip to content

Commit 3247637

Browse files
committed
All transformers that can support composable parallelism do
1 parent b993936 commit 3247637

File tree

10 files changed

+145
-5
lines changed

10 files changed

+145
-5
lines changed

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,10 @@ public <R2> EitherT<M, L, R2> fmap(Fn1<? super R, ? extends R2> fn) {
8585
@Override
8686
public <R2> EitherT<M, L, R2> zip(
8787
Applicative<Fn1<? super R, ? extends R2>, EitherT<M, L, ?>> appFn) {
88-
return MonadT.super.zip(appFn).coerce();
88+
return eitherT(new Compose<>(this.<MonadRec<Either<L, R>, M>>runEitherT()).zip(
89+
new Compose<>(appFn.<EitherT<M, L, Fn1<? super R, ? extends R2>>>coerce()
90+
.<MonadRec<Either<L, Fn1<? super R, ? extends R2>>, M>>runEitherT()))
91+
.getCompose());
8992
}
9093

9194
/**

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,10 @@ public <B> IdentityT<M, B> fmap(Fn1<? super A, ? extends B> fn) {
9292
*/
9393
@Override
9494
public <B> IdentityT<M, B> zip(Applicative<Fn1<? super A, ? extends B>, IdentityT<M, ?>> appFn) {
95-
return MonadT.super.zip(appFn).coerce();
95+
return identityT(new Compose<>(this.<MonadRec<Identity<A>, M>>runIdentityT()).zip(
96+
new Compose<>(appFn.<IdentityT<M, Fn1<? super A, ? extends B>>>coerce()
97+
.<MonadRec<Identity<Fn1<? super A, ? extends B>>, M>>runIdentityT()))
98+
.getCompose());
9699
}
97100

98101
/**

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,9 @@ public <B> LazyT<M, B> fmap(Fn1<? super A, ? extends B> fn) {
8888
*/
8989
@Override
9090
public <B> LazyT<M, B> zip(Applicative<Fn1<? super A, ? extends B>, LazyT<M, ?>> appFn) {
91-
return MonadT.super.zip(appFn).coerce();
91+
return lazyT(new Compose<>(this.<MonadRec<Lazy<A>, M>>runLazyT()).zip(
92+
new Compose<>(appFn.<LazyT<M, Fn1<? super A, ? extends B>>>coerce()
93+
.<MonadRec<Lazy<Fn1<? super A, ? extends B>>, M>>runLazyT())).getCompose());
9294
}
9395

9496
/**

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,10 @@ public <B> MaybeT<M, B> pure(B b) {
7373
*/
7474
@Override
7575
public <B> MaybeT<M, B> zip(Applicative<Fn1<? super A, ? extends B>, MaybeT<M, ?>> appFn) {
76-
return MonadT.super.zip(appFn).coerce();
76+
return maybeT(new Compose<>(this.<MonadRec<Maybe<A>, M>>runMaybeT()).zip(
77+
new Compose<>(appFn.<MaybeT<M, Fn1<? super A, ? extends B>>>coerce()
78+
.<MonadRec<Maybe<Fn1<? super A, ? extends B>>, M>>runMaybeT()))
79+
.getCompose());
7780
}
7881

7982
/**

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
package com.jnape.palatable.lambda.monad.transformer.builtin;
22

3+
import com.jnape.palatable.lambda.adt.Either;
4+
import com.jnape.palatable.lambda.adt.Unit;
35
import com.jnape.palatable.lambda.functor.builtin.Identity;
6+
import com.jnape.palatable.lambda.io.IO;
47
import com.jnape.palatable.traitor.annotations.TestTraits;
58
import com.jnape.palatable.traitor.framework.Subjects;
69
import com.jnape.palatable.traitor.runners.Traits;
@@ -12,13 +15,18 @@
1215
import testsupport.traits.MonadLaws;
1316
import testsupport.traits.MonadRecLaws;
1417

18+
import java.util.concurrent.CountDownLatch;
19+
import java.util.concurrent.Executors;
20+
1521
import static com.jnape.palatable.lambda.adt.Either.left;
1622
import static com.jnape.palatable.lambda.adt.Either.right;
1723
import static com.jnape.palatable.lambda.adt.Maybe.just;
1824
import static com.jnape.palatable.lambda.adt.Maybe.nothing;
1925
import static com.jnape.palatable.lambda.functor.builtin.Identity.pureIdentity;
2026
import static com.jnape.palatable.lambda.functor.builtin.Lazy.lazy;
27+
import static com.jnape.palatable.lambda.io.IO.io;
2128
import static com.jnape.palatable.lambda.monad.transformer.builtin.EitherT.eitherT;
29+
import static com.jnape.palatable.lambda.monad.transformer.builtin.EitherT.liftEitherT;
2230
import static com.jnape.palatable.traitor.framework.Subjects.subjects;
2331
import static org.junit.Assert.assertEquals;
2432

@@ -45,6 +53,20 @@ public void lazyZip() {
4553
})).value());
4654
}
4755

56+
@Test(timeout = 500)
57+
public void composedZip() {
58+
CountDownLatch latch = new CountDownLatch(2);
59+
IO<Unit> countdownAndAwait = io(() -> {
60+
latch.countDown();
61+
latch.await();
62+
});
63+
EitherT<IO<?>, Object, Unit> lifted = liftEitherT().apply(countdownAndAwait);
64+
lifted.discardL(lifted)
65+
.<IO<Either<Object, Unit>>>runEitherT()
66+
.unsafePerformAsyncIO(Executors.newFixedThreadPool(2))
67+
.join();
68+
}
69+
4870
@Test
4971
public void staticPure() {
5072
EitherT<Identity<?>, String, Integer> eitherT = EitherT.<Identity<?>, String>pureEitherT(pureIdentity())

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
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.functor.builtin.Identity;
6+
import com.jnape.palatable.lambda.io.IO;
57
import com.jnape.palatable.traitor.annotations.TestTraits;
68
import com.jnape.palatable.traitor.runners.Traits;
79
import org.junit.Test;
@@ -11,11 +13,16 @@
1113
import testsupport.traits.MonadLaws;
1214
import testsupport.traits.MonadRecLaws;
1315

16+
import java.util.concurrent.CountDownLatch;
17+
import java.util.concurrent.Executors;
18+
1419
import static com.jnape.palatable.lambda.adt.Maybe.just;
1520
import static com.jnape.palatable.lambda.adt.Maybe.nothing;
1621
import static com.jnape.palatable.lambda.adt.Maybe.pureMaybe;
1722
import static com.jnape.palatable.lambda.functor.builtin.Lazy.lazy;
23+
import static com.jnape.palatable.lambda.io.IO.io;
1824
import static com.jnape.palatable.lambda.monad.transformer.builtin.IdentityT.identityT;
25+
import static com.jnape.palatable.lambda.monad.transformer.builtin.IdentityT.liftIdentityT;
1926
import static com.jnape.palatable.lambda.monad.transformer.builtin.IdentityT.pureIdentityT;
2027
import static org.junit.Assert.assertEquals;
2128

@@ -43,4 +50,18 @@ public void staticPure() {
4350
IdentityT<Maybe<?>, Integer> identityT = pureIdentityT(pureMaybe()).apply(1);
4451
assertEquals(identityT(just(new Identity<>(1))), identityT);
4552
}
53+
54+
@Test(timeout = 500)
55+
public void composedZip() {
56+
CountDownLatch latch = new CountDownLatch(2);
57+
IO<Unit> countdownAndAwait = io(() -> {
58+
latch.countDown();
59+
latch.await();
60+
});
61+
IdentityT<IO<?>, Unit> lifted = liftIdentityT().apply(countdownAndAwait);
62+
lifted.discardL(lifted)
63+
.<IO<Identity<Unit>>>runIdentityT()
64+
.unsafePerformAsyncIO(Executors.newFixedThreadPool(2))
65+
.join();
66+
}
4667
}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
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.functor.builtin.Identity;
6+
import com.jnape.palatable.lambda.functor.builtin.Lazy;
7+
import com.jnape.palatable.lambda.io.IO;
58
import com.jnape.palatable.traitor.annotations.TestTraits;
69
import com.jnape.palatable.traitor.runners.Traits;
710
import org.junit.Test;
@@ -11,11 +14,16 @@
1114
import testsupport.traits.MonadLaws;
1215
import testsupport.traits.MonadRecLaws;
1316

17+
import java.util.concurrent.CountDownLatch;
18+
import java.util.concurrent.Executors;
19+
1420
import static com.jnape.palatable.lambda.adt.Maybe.just;
1521
import static com.jnape.palatable.lambda.adt.Maybe.nothing;
1622
import static com.jnape.palatable.lambda.functor.builtin.Identity.pureIdentity;
1723
import static com.jnape.palatable.lambda.functor.builtin.Lazy.lazy;
24+
import static com.jnape.palatable.lambda.io.IO.io;
1825
import static com.jnape.palatable.lambda.monad.transformer.builtin.LazyT.lazyT;
26+
import static com.jnape.palatable.lambda.monad.transformer.builtin.LazyT.liftLazyT;
1927
import static com.jnape.palatable.lambda.monad.transformer.builtin.LazyT.pureLazyT;
2028
import static org.junit.Assert.assertEquals;
2129

@@ -43,4 +51,18 @@ public void staticPure() {
4351
LazyT<Identity<?>, Integer> lazyT = pureLazyT(pureIdentity()).apply(1);
4452
assertEquals(lazyT(new Identity<>(lazy(1))), lazyT);
4553
}
54+
55+
@Test(timeout = 500)
56+
public void composedZip() {
57+
CountDownLatch latch = new CountDownLatch(2);
58+
IO<Unit> countdownAndAwait = io(() -> {
59+
latch.countDown();
60+
latch.await();
61+
});
62+
LazyT<IO<?>, Unit> lifted = liftLazyT().apply(countdownAndAwait);
63+
lifted.discardL(lifted)
64+
.<IO<Lazy<Unit>>>runLazyT()
65+
.unsafePerformAsyncIO(Executors.newFixedThreadPool(2))
66+
.join();
67+
}
4668
}

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

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.jnape.palatable.lambda.monad.transformer.builtin;
22

33
import com.jnape.palatable.lambda.adt.Either;
4+
import com.jnape.palatable.lambda.adt.Maybe;
5+
import com.jnape.palatable.lambda.adt.Unit;
46
import com.jnape.palatable.lambda.functor.builtin.Identity;
7+
import com.jnape.palatable.lambda.io.IO;
58
import com.jnape.palatable.traitor.annotations.TestTraits;
69
import com.jnape.palatable.traitor.framework.Subjects;
710
import com.jnape.palatable.traitor.runners.Traits;
@@ -12,12 +15,17 @@
1215
import testsupport.traits.MonadLaws;
1316
import testsupport.traits.MonadRecLaws;
1417

18+
import java.util.concurrent.CountDownLatch;
19+
import java.util.concurrent.Executors;
20+
1521
import static com.jnape.palatable.lambda.adt.Either.left;
1622
import static com.jnape.palatable.lambda.adt.Either.right;
1723
import static com.jnape.palatable.lambda.adt.Maybe.just;
1824
import static com.jnape.palatable.lambda.adt.Maybe.nothing;
1925
import static com.jnape.palatable.lambda.functor.builtin.Identity.pureIdentity;
2026
import static com.jnape.palatable.lambda.functor.builtin.Lazy.lazy;
27+
import static com.jnape.palatable.lambda.io.IO.io;
28+
import static com.jnape.palatable.lambda.monad.transformer.builtin.MaybeT.liftMaybeT;
2129
import static com.jnape.palatable.lambda.monad.transformer.builtin.MaybeT.maybeT;
2230
import static com.jnape.palatable.lambda.monad.transformer.builtin.MaybeT.pureMaybeT;
2331
import static com.jnape.palatable.traitor.framework.Subjects.subjects;
@@ -48,4 +56,18 @@ public void staticPure() {
4856
MaybeT<Identity<?>, Integer> maybeT = pureMaybeT(pureIdentity()).apply(1);
4957
assertEquals(maybeT(new Identity<>(just(1))), maybeT);
5058
}
59+
60+
@Test(timeout = 500)
61+
public void composedZip() {
62+
CountDownLatch latch = new CountDownLatch(2);
63+
IO<Unit> countdownAndAwait = io(() -> {
64+
latch.countDown();
65+
latch.await();
66+
});
67+
MaybeT<IO<?>, Unit> lifted = liftMaybeT().apply(countdownAndAwait);
68+
lifted.discardL(lifted)
69+
.<IO<Maybe<Unit>>>runMaybeT()
70+
.unsafePerformAsyncIO(Executors.newFixedThreadPool(2))
71+
.join();
72+
}
5173
}

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

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
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.functor.builtin.Identity;
6+
import com.jnape.palatable.lambda.io.IO;
57
import com.jnape.palatable.traitor.annotations.TestTraits;
68
import com.jnape.palatable.traitor.runners.Traits;
79
import org.junit.Test;
@@ -10,11 +12,16 @@
1012
import testsupport.traits.Equivalence;
1113
import testsupport.traits.FunctorLaws;
1214
import testsupport.traits.MonadLaws;
13-
import testsupport.traits.MonadRecLaws;
1415
import testsupport.traits.MonadReaderLaws;
16+
import testsupport.traits.MonadRecLaws;
17+
18+
import java.util.concurrent.CountDownLatch;
19+
import java.util.concurrent.Executors;
1520

1621
import static com.jnape.palatable.lambda.adt.Maybe.just;
22+
import static com.jnape.palatable.lambda.adt.Unit.UNIT;
1723
import static com.jnape.palatable.lambda.functor.builtin.Identity.pureIdentity;
24+
import static com.jnape.palatable.lambda.io.IO.io;
1825
import static com.jnape.palatable.lambda.monad.transformer.builtin.ReaderT.readerT;
1926
import static org.junit.Assert.assertEquals;
2027
import static testsupport.traits.Equivalence.equivalence;
@@ -57,4 +64,18 @@ public void staticPure() {
5764
ReaderT.<String, Identity<?>>pureReaderT(pureIdentity()).apply(1);
5865
assertEquals(new Identity<>(1), readerT.runReaderT("foo"));
5966
}
67+
68+
@Test(timeout = 500)
69+
public void composedZip() {
70+
CountDownLatch latch = new CountDownLatch(2);
71+
IO<Unit> countdownAndAwait = io(() -> {
72+
latch.countDown();
73+
latch.await();
74+
});
75+
ReaderT<Unit, IO<?>, Unit> lifted = ReaderT.<Unit>liftReaderT().apply(countdownAndAwait);
76+
lifted.discardL(lifted)
77+
.<IO<Unit>>runReaderT(UNIT)
78+
.unsafePerformAsyncIO(Executors.newFixedThreadPool(2))
79+
.join();
80+
}
6081
}

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package com.jnape.palatable.lambda.monad.transformer.builtin;
22

3+
import com.jnape.palatable.lambda.adt.Unit;
34
import com.jnape.palatable.lambda.adt.hlist.Tuple2;
45
import com.jnape.palatable.lambda.functor.builtin.Identity;
6+
import com.jnape.palatable.lambda.io.IO;
57
import com.jnape.palatable.traitor.annotations.TestTraits;
68
import com.jnape.palatable.traitor.runners.Traits;
79
import org.junit.Test;
@@ -13,11 +15,16 @@
1315
import testsupport.traits.MonadRecLaws;
1416
import testsupport.traits.MonadWriterLaws;
1517

18+
import java.util.concurrent.CountDownLatch;
19+
import java.util.concurrent.Executors;
20+
1621
import static com.jnape.palatable.lambda.adt.Unit.UNIT;
1722
import static com.jnape.palatable.lambda.adt.hlist.HList.tuple;
1823
import static com.jnape.palatable.lambda.functor.builtin.Identity.pureIdentity;
24+
import static com.jnape.palatable.lambda.io.IO.io;
1925
import static com.jnape.palatable.lambda.monad.transformer.builtin.WriterT.writerT;
2026
import static com.jnape.palatable.lambda.monoid.builtin.Join.join;
27+
import static com.jnape.palatable.lambda.monoid.builtin.Trivial.trivial;
2128
import static org.junit.Assert.assertEquals;
2229
import static testsupport.traits.Equivalence.equivalence;
2330

@@ -64,4 +71,18 @@ public void staticLift() {
6471
assertEquals(new Identity<>(tuple(1, "")),
6572
apply.runWriterT(join()));
6673
}
74+
75+
@Test(timeout = 500)
76+
public void composedZip() {
77+
CountDownLatch latch = new CountDownLatch(2);
78+
IO<Unit> countdownAndAwait = io(() -> {
79+
latch.countDown();
80+
latch.await();
81+
});
82+
WriterT<Unit, IO<?>, Unit> lifted = WriterT.<Unit>liftWriterT().apply(countdownAndAwait);
83+
lifted.discardL(lifted)
84+
.<IO<Tuple2<Unit, Unit>>>runWriterT(trivial())
85+
.unsafePerformAsyncIO(Executors.newFixedThreadPool(2))
86+
.join();
87+
}
6788
}

0 commit comments

Comments
 (0)