Skip to content

Commit 9c58bfe

Browse files
committed
Merge pull request #246 from puffnfresh/feature/semigroups
Some more Semigroup and Monoid instances
2 parents 18a73dc + 77f45b6 commit 9c58bfe

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

core/src/main/java/fj/Monoid.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
import static fj.Function.flip;
55
import fj.data.Array;
66
import fj.data.List;
7+
import fj.data.IO;
8+
import fj.data.IOFunctions;
79
import fj.data.Natural;
810
import fj.data.Option;
911
import fj.data.Set;
@@ -384,6 +386,18 @@ public static <A> Monoid<Array<A>> arrayMonoid() {
384386
return monoid(Semigroup.<A>arraySemigroup(), Array.<A>empty());
385387
}
386388

389+
/**
390+
* A monoid for IO values.
391+
*/
392+
public static <A> Monoid<IO<A>> ioMonoid(final Monoid <A> ma) {
393+
return monoid(Semigroup.ioSemigroup(ma.semigroup()), IOFunctions.unit(ma.zero()));
394+
}
395+
396+
/**
397+
* A monoid for the Unit value.
398+
*/
399+
public static final Monoid<Unit> unitMonoid = monoid(Semigroup.unitSemigroup, Unit.unit());
400+
387401
/**
388402
* A monoid for sets.
389403
*

core/src/main/java/fj/Semigroup.java

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import fj.data.Array;
44
import fj.data.List;
5+
import fj.data.IO;
6+
import fj.data.IOFunctions;
57
import fj.data.Natural;
68
import fj.data.NonEmptyList;
79
import fj.data.Option;
@@ -262,6 +264,20 @@ public static <A> Semigroup<A> semigroup(final F2<A, A, A> sum) {
262264
public static final Semigroup<StringBuilder> stringBuilderSemigroup =
263265
semigroup((s1, s2) -> new StringBuilder(s1).append(s2));
264266

267+
/**
268+
* A semigroup which always uses the "first" (left-hand side) value.
269+
*/
270+
public static <A> Semigroup<A> firstSemigroup() {
271+
return semigroup((a1, a2) -> a1);
272+
}
273+
274+
/**
275+
* A semigroup which always uses the "last" (right-hand side) value.
276+
*/
277+
public static <A> Semigroup<A> lastSemigroup() {
278+
return semigroup((a1, a2) -> a2);
279+
}
280+
265281
/**
266282
* A semigroup for functions.
267283
*
@@ -355,6 +371,13 @@ public static <A, B> Semigroup<P2<A, B>> p2Semigroup(final Semigroup<A> sa, fina
355371
return semigroup((a1, a2) -> P.lazy(() -> sa.sum(a1._1(), a2._1()), () -> sb.sum(a1._2(), a2._2())));
356372
}
357373

374+
/**
375+
* A semigroup for IO values.
376+
*/
377+
public static <A> Semigroup<IO<A>> ioSemigroup(final Semigroup <A> sa) {
378+
return semigroup((a1, a2) -> IOFunctions.liftM2(a1, a2, sa::sum));
379+
}
380+
358381
/**
359382
* A semigroup for the Unit value.
360383
*/

0 commit comments

Comments
 (0)