1414import java .math .BigInteger ;
1515
1616import static fj .Function .curry ;
17+ import static fj .Function .flip ;
1718
1819/**
1920 * Implementations must satisfy the law of associativity:
@@ -96,6 +97,27 @@ static <A> A multiply1p(F<A, F<A, A>> sum, int n, A a) {
9697 }
9798 }
9899
100+ /**
101+ * Sums the given values with left-fold.
102+ */
103+ public A sumNel (final NonEmptyList <A > as ) {
104+ return as .foldLeft1 (sum );
105+ }
106+
107+ /**
108+ * Swaps the arguments when summing.
109+ */
110+ public Semigroup <A > dual () {
111+ return semigroup (flip (sum ));
112+ }
113+
114+ /**
115+ * Lifts the semigroup to obtain a trivial monoid.
116+ */
117+ public Monoid <Option <A >> lift () {
118+ return Monoid .monoid (a -> b -> Option .liftM2 (sum ).f (a ).f (b ).orElse (a ).orElse (b ), Option .none ());
119+ }
120+
99121 /**
100122 * Constructs a semigroup from the given function.
101123 *
@@ -139,12 +161,12 @@ public static <A> Semigroup<A> semigroup(final F2<A, A, A> sum) {
139161 /**
140162 * A semigroup that yields the maximum of integers.
141163 */
142- public static final Semigroup <Integer > intMaximumSemigroup = semigroup ( Ord .intOrd .max );
164+ public static final Semigroup <Integer > intMaximumSemigroup = Ord .intOrd .maxSemigroup ( );
143165
144166 /**
145167 * A semigroup that yields the minimum of integers.
146168 */
147- public static final Semigroup <Integer > intMinimumSemigroup = semigroup ( Ord .intOrd .min );
169+ public static final Semigroup <Integer > intMinimumSemigroup = Ord .intOrd .minSemigroup ( );
148170
149171 /**
150172 * A semigroup that adds big integers.
@@ -161,12 +183,12 @@ public static <A> Semigroup<A> semigroup(final F2<A, A, A> sum) {
161183 /**
162184 * A semigroup that yields the maximum of big integers.
163185 */
164- public static final Semigroup <BigInteger > bigintMaximumSemigroup = semigroup ( Ord .bigintOrd .max );
186+ public static final Semigroup <BigInteger > bigintMaximumSemigroup = Ord .bigintOrd .maxSemigroup ( );
165187
166188 /**
167189 * A semigroup that yields the minimum of big integers.
168190 */
169- public static final Semigroup <BigInteger > bigintMinimumSemigroup = semigroup ( Ord .bigintOrd .min );
191+ public static final Semigroup <BigInteger > bigintMinimumSemigroup = Ord .bigintOrd .minSemigroup ( );
170192
171193 /**
172194 * A semigroup that adds big decimals.
@@ -183,12 +205,12 @@ public static <A> Semigroup<A> semigroup(final F2<A, A, A> sum) {
183205 /**
184206 * A semigroup that yields the maximum of big decimals.
185207 */
186- public static final Semigroup <BigDecimal > bigDecimalMaximumSemigroup = semigroup ( Ord .bigdecimalOrd .max );
208+ public static final Semigroup <BigDecimal > bigDecimalMaximumSemigroup = Ord .bigdecimalOrd .maxSemigroup ( );
187209
188210 /**
189211 * A semigroup that yields the minimum of big decimals.
190212 */
191- public static final Semigroup <BigDecimal > bigDecimalMinimumSemigroup = semigroup ( Ord .bigdecimalOrd .min );
213+ public static final Semigroup <BigDecimal > bigDecimalMinimumSemigroup = Ord .bigdecimalOrd .minSemigroup ( );
192214
193215 /**
194216 * A semigroup that multiplies natural numbers.
@@ -205,12 +227,12 @@ public static <A> Semigroup<A> semigroup(final F2<A, A, A> sum) {
205227 /**
206228 * A semigroup that yields the maximum of natural numbers.
207229 */
208- public static final Semigroup <Natural > naturalMaximumSemigroup = semigroup ( Ord .naturalOrd .max );
230+ public static final Semigroup <Natural > naturalMaximumSemigroup = Ord .naturalOrd .maxSemigroup ( );
209231
210232 /**
211233 * A semigroup that yields the minimum of natural numbers.
212234 */
213- public static final Semigroup <Natural > naturalMinimumSemigroup = semigroup ( Ord .naturalOrd .min );
235+ public static final Semigroup <Natural > naturalMinimumSemigroup = Ord .naturalOrd .minSemigroup ( );
214236
215237 /**
216238 * A semigroup that adds longs.
@@ -225,12 +247,12 @@ public static <A> Semigroup<A> semigroup(final F2<A, A, A> sum) {
225247 /**
226248 * A semigroup that yields the maximum of longs.
227249 */
228- public static final Semigroup <Long > longMaximumSemigroup = semigroup ( Ord .longOrd .max );
250+ public static final Semigroup <Long > longMaximumSemigroup = Ord .longOrd .maxSemigroup ( );
229251
230252 /**
231253 * A semigroup that yields the minimum of longs.
232254 */
233- public static final Semigroup <Long > longMinimumSemigroup = semigroup ( Ord .longOrd .min );
255+ public static final Semigroup <Long > longMinimumSemigroup = Ord .longOrd .minSemigroup ( );
234256
235257 /**
236258 * A semigroup that ORs booleans.
0 commit comments