Skip to content

Commit efefe5a

Browse files
committed
RunAll semigroup and monoid for IO<A>
1 parent 14cb27f commit efefe5a

File tree

5 files changed

+125
-0
lines changed

5 files changed

+125
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/).
3434
- `Between`, for determining if a value is in a closed interval
3535
- `Strong`, profunctor strength
3636
- `IO` monad
37+
- `RunAll` semigroup and monoid instance for `IO<A>`
3738

3839
### Deprecated
3940
- `AddAll` semigroup, in favor of the monoid that no longer mutates any argument
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package com.jnape.palatable.lambda.monoid.builtin;
2+
3+
import com.jnape.palatable.lambda.functions.Fn1;
4+
import com.jnape.palatable.lambda.functions.IO;
5+
import com.jnape.palatable.lambda.functions.specialized.MonoidFactory;
6+
import com.jnape.palatable.lambda.monoid.Monoid;
7+
import com.jnape.palatable.lambda.semigroup.Semigroup;
8+
9+
import static com.jnape.palatable.lambda.functions.IO.io;
10+
import static com.jnape.palatable.lambda.monoid.Monoid.monoid;
11+
12+
/**
13+
* Run {@link IO} operations, aggregating their results in terms of the provided {@link Monoid}.
14+
*
15+
* @param <A> the {@link IO} result
16+
* @see com.jnape.palatable.lambda.semigroup.builtin.RunAll
17+
*/
18+
public final class RunAll<A> implements MonoidFactory<Monoid<A>, IO<A>> {
19+
20+
private static final RunAll INSTANCE = new RunAll();
21+
22+
private RunAll() {
23+
}
24+
25+
@Override
26+
public Monoid<IO<A>> apply(Monoid<A> monoid) {
27+
Semigroup<IO<A>> semigroup = com.jnape.palatable.lambda.semigroup.builtin.RunAll.runAll(monoid);
28+
return monoid(semigroup, io(monoid.identity()));
29+
}
30+
31+
@SuppressWarnings("unchecked")
32+
public static <A> RunAll<A> runAll() {
33+
return INSTANCE;
34+
}
35+
36+
public static <A> Monoid<IO<A>> runAll(Monoid<A> monoid) {
37+
return RunAll.<A>runAll().apply(monoid);
38+
}
39+
40+
public static <A> Fn1<IO<A>, IO<A>> runAll(Monoid<A> monoid, IO<A> x) {
41+
return runAll(monoid).apply(x);
42+
}
43+
44+
public static <A> IO<A> runAll(Monoid<A> monoid, IO<A> x, IO<A> y) {
45+
return runAll(monoid, x).apply(y);
46+
}
47+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
package com.jnape.palatable.lambda.semigroup.builtin;
2+
3+
import com.jnape.palatable.lambda.functions.Fn1;
4+
import com.jnape.palatable.lambda.functions.IO;
5+
import com.jnape.palatable.lambda.functions.specialized.SemigroupFactory;
6+
import com.jnape.palatable.lambda.semigroup.Semigroup;
7+
8+
/**
9+
* Run {@link IO} operations, aggregating their results in terms of the provided {@link Semigroup}.
10+
*
11+
* @param <A> the {@link IO} result
12+
* @see com.jnape.palatable.lambda.monoid.builtin.RunAll
13+
*/
14+
public final class RunAll<A> implements SemigroupFactory<Semigroup<A>, IO<A>> {
15+
16+
private static final RunAll INSTANCE = new RunAll();
17+
18+
private RunAll() {
19+
}
20+
21+
@Override
22+
public Semigroup<IO<A>> apply(Semigroup<A> semigroup) {
23+
return (ioX, ioY) -> ioY.zip(ioX.fmap(semigroup));
24+
}
25+
26+
@SuppressWarnings("unchecked")
27+
public static <A> RunAll<A> runAll() {
28+
return INSTANCE;
29+
}
30+
31+
public static <A> Semigroup<IO<A>> runAll(Semigroup<A> semigroup) {
32+
return RunAll.<A>runAll().apply(semigroup);
33+
}
34+
35+
public static <A> Fn1<IO<A>, IO<A>> runAll(Semigroup<A> semigroup, IO<A> ioX) {
36+
return runAll(semigroup).apply(ioX);
37+
}
38+
39+
public static <A> IO<A> runAll(Semigroup<A> semigroup, IO<A> ioX, IO<A> ioY) {
40+
return runAll(semigroup, ioX).apply(ioY);
41+
}
42+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.jnape.palatable.lambda.monoid.builtin;
2+
3+
import com.jnape.palatable.lambda.monoid.Monoid;
4+
import org.junit.Test;
5+
6+
import static com.jnape.palatable.lambda.functions.IO.io;
7+
import static com.jnape.palatable.lambda.monoid.builtin.RunAll.runAll;
8+
import static org.junit.Assert.assertEquals;
9+
10+
public class RunAllTest {
11+
12+
@Test
13+
public void monoid() {
14+
Monoid<Integer> add = Monoid.monoid((x, y) -> x + y, 0);
15+
assertEquals((Integer) 3, runAll(add).apply(io(1), io(2)).unsafePerformIO());
16+
assertEquals((Integer) 0, runAll(add).identity().unsafePerformIO());
17+
}
18+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.jnape.palatable.lambda.semigroup.builtin;
2+
3+
import com.jnape.palatable.lambda.semigroup.Semigroup;
4+
import org.junit.Test;
5+
6+
import static com.jnape.palatable.lambda.functions.IO.io;
7+
import static com.jnape.palatable.lambda.semigroup.builtin.RunAll.runAll;
8+
import static org.junit.Assert.assertEquals;
9+
10+
public class RunAllTest {
11+
12+
@Test
13+
public void semigroup() {
14+
Semigroup<Integer> add = (x, y) -> x + y;
15+
assertEquals((Integer) 3, runAll(add).apply(io(1), io(2)).unsafePerformIO());
16+
}
17+
}

0 commit comments

Comments
 (0)