annotate src/main/java/fj/Monoid.java @ 0:fe80c1edf1be

add getLoop
author tatsuki
date Fri, 20 Mar 2015 21:04:03 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
1 package fj;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
2
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
3 import static fj.Function.curry;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
4 import static fj.Function.compose;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
5 import static fj.Function.flip;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
6 import fj.data.Array;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
7 import fj.data.List;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
8 import fj.data.Natural;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
9 import fj.data.Option;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
10 import fj.data.Set;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
11 import fj.data.Stream;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
12 import static fj.data.Stream.iterableStream;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
13
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
14 import java.math.BigInteger;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
15 import java.math.BigDecimal;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
16
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
17 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
18 * A monoid abstraction to be defined across types of the given type argument. Implementations must
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
19 * follow the monoidal laws:
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
20 * <ul>
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
21 * <li><em>Left Identity</em>; forall x. sum(zero(), x) == x</li>
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
22 * <li><em>Right Identity</em>; forall x. sum(x, zero()) == x</li>
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
23 * <li><em>Associativity</em>; forall x. forall y. forall z. sum(sum(x, y), z) == sum(x, sum(y, z))</li>
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
24 * </ul>
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
25 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
26 * @version %build.number%
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
27 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
28 public final class Monoid<A> {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
29 private final F<A, F<A, A>> sum;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
30 private final A zero;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
31
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
32 private Monoid(final F<A, F<A, A>> sum, final A zero) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
33 this.sum = sum;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
34 this.zero = zero;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
35 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
36
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
37 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
38 * Returns a semigroup projection of this monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
39 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
40 * @return A semigroup projection of this monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
41 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
42 public Semigroup<A> semigroup() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
43 return Semigroup.semigroup(sum);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
44 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
45
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
46 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
47 * Sums the two given arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
48 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
49 * @param a1 A value to sum with another.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
50 * @param a2 A value to sum with another.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
51 * @return The of the two given arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
52 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
53 public A sum(final A a1, final A a2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
54 return sum.f(a1).f(a2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
55 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
56
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
57 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
58 * Returns a function that sums the given value according to this monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
59 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
60 * @param a1 The value to sum.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
61 * @return A function that sums the given value according to this monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
62 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
63 public F<A, A> sum(final A a1) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
64 return sum.f(a1);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
65 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
66
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
67 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
68 * Returns a function that sums according to this monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
69 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
70 * @return A function that sums according to this monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
71 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
72 public F<A, F<A, A>> sum() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
73 return sum;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
74 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
75
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
76 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
77 * The zero value for this monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
78 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
79 * @return The zero value for this monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
80 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
81 public A zero() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
82 return zero;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
83 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
84
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
85 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
86 * Sums the given values with right-fold.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
87 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
88 * @param as The values to sum.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
89 * @return The sum of the given values.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
90 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
91 public A sumRight(final List<A> as) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
92 return as.foldRight(sum, zero);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
93 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
94
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
95 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
96 * Sums the given values with right-fold.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
97 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
98 * @param as The values to sum.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
99 * @return The sum of the given values.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
100 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
101 public A sumRight(final Stream<A> as) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
102 return as.foldRight(new F2<A, P1<A>, A>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
103 public A f(final A a, final P1<A> ap1) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
104 return sum(a, ap1._1());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
105 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
106 }, zero);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
107 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
108
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
109 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
110 * Sums the given values with left-fold.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
111 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
112 * @param as The values to sum.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
113 * @return The sum of the given values.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
114 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
115 public A sumLeft(final List<A> as) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
116 return as.foldLeft(sum, zero);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
117 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
118
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
119 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
120 * Sums the given values with left-fold.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
121 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
122 * @param as The values to sum.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
123 * @return The sum of the given values.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
124 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
125 public A sumLeft(final Stream<A> as) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
126 return as.foldLeft(sum, zero);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
127 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
128
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
129 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
130 * Returns a function that sums the given values with left-fold.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
131 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
132 * @return a function that sums the given values with left-fold.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
133 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
134 public F<List<A>, A> sumLeft() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
135 return new F<List<A>, A>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
136 public A f(final List<A> as) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
137 return sumLeft(as);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
138 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
139 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
140 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
141
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
142 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
143 * Returns a function that sums the given values with right-fold.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
144 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
145 * @return a function that sums the given values with right-fold.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
146 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
147 public F<List<A>, A> sumRight() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
148 return new F<List<A>, A>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
149 public A f(final List<A> as) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
150 return sumRight(as);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
151 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
152 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
153 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
154
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
155 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
156 * Returns a function that sums the given values with left-fold.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
157 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
158 * @return a function that sums the given values with left-fold.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
159 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
160 public F<Stream<A>, A> sumLeftS() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
161 return new F<Stream<A>, A>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
162 public A f(final Stream<A> as) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
163 return sumLeft(as);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
164 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
165 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
166 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
167
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
168 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
169 * Intersperses the given value between each two elements of the iterable, and sums the result.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
170 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
171 * @param as An iterable of values to sum.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
172 * @param a The value to intersperse between values of the given iterable.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
173 * @return The sum of the given values and the interspersed value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
174 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
175 public A join(final Iterable<A> as, final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
176 final Stream<A> s = iterableStream(as);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
177 return s.isEmpty() ?
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
178 zero :
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
179 s.foldLeft1(compose(sum, flip(sum).f(a)));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
180 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
181
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
182 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
183 * Constructs a monoid from the given sum function and zero value, which must follow the monoidal
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
184 * laws.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
185 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
186 * @param sum The sum function for the monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
187 * @param zero The zero for the monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
188 * @return A monoid instance that uses the given sun function and zero value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
189 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
190 public static <A> Monoid<A> monoid(final F<A, F<A, A>> sum, final A zero) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
191 return new Monoid<A>(sum, zero);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
192 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
193
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
194 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
195 * Constructs a monoid from the given sum function and zero value, which must follow the monoidal
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
196 * laws.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
197 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
198 * @param sum The sum function for the monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
199 * @param zero The zero for the monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
200 * @return A monoid instance that uses the given sun function and zero value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
201 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
202 public static <A> Monoid<A> monoid(final F2<A, A, A> sum, final A zero) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
203 return new Monoid<A>(curry(sum), zero);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
204 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
205
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
206 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
207 * Constructs a monoid from the given semigroup and zero value, which must follow the monoidal laws.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
208 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
209 * @param s The semigroup for the monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
210 * @param zero The zero for the monoid.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
211 * @return A monoid instance that uses the given sun function and zero value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
212 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
213 public static <A> Monoid<A> monoid(final Semigroup<A> s, final A zero) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
214 return new Monoid<A>(s.sum(), zero);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
215 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
216
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
217 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
218 * A monoid that adds integers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
219 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
220 public static final Monoid<Integer> intAdditionMonoid = monoid(Semigroup.intAdditionSemigroup, 0);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
221
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
222 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
223 * A monoid that multiplies integers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
224 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
225 public static final Monoid<Integer> intMultiplicationMonoid = monoid(Semigroup.intMultiplicationSemigroup, 1);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
226
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
227 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
228 * A monoid that adds doubles.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
229 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
230 public static final Monoid<Double> doubleAdditionMonoid = monoid(Semigroup.doubleAdditionSemigroup, 0.0);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
231
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
232 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
233 * A monoid that multiplies doubles.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
234 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
235 public static final Monoid<Double> doubleMultiplicationMonoid = monoid(Semigroup.doubleMultiplicationSemigroup, 1.0);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
236
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
237 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
238 * A monoid that adds big integers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
239 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
240 public static final Monoid<BigInteger> bigintAdditionMonoid = monoid(Semigroup.bigintAdditionSemigroup, BigInteger.ZERO);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
241
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
242 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
243 * A monoid that multiplies big integers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
244 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
245 public static final Monoid<BigInteger> bigintMultiplicationMonoid =
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
246 monoid(Semigroup.bigintMultiplicationSemigroup, BigInteger.ONE);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
247
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
248 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
249 * A monoid that adds big decimals.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
250 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
251 public static final Monoid<BigDecimal> bigdecimalAdditionMonoid =
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
252 monoid(Semigroup.bigdecimalAdditionSemigroup, BigDecimal.ZERO);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
253
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
254 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
255 * A monoid that multiplies big decimals.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
256 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
257 public static final Monoid<BigDecimal> bigdecimalMultiplicationMonoid =
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
258 monoid(Semigroup.bigdecimalMultiplicationSemigroup, BigDecimal.ONE);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
259
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
260 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
261 * A monoid that adds natural numbers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
262 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
263 public static final Monoid<Natural> naturalAdditionMonoid =
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
264 monoid(Semigroup.naturalAdditionSemigroup, Natural.ZERO);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
265
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
266 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
267 * A monoid that multiplies natural numbers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
268 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
269 public static final Monoid<Natural> naturalMultiplicationMonoid =
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
270 monoid(Semigroup.naturalMultiplicationSemigroup, Natural.ONE);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
271
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
272 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
273 * A monoid that adds longs.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
274 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
275 public static final Monoid<Long> longAdditionMonoid = monoid(Semigroup.longAdditionSemigroup, 0L);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
276
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
277 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
278 * A monoid that multiplies longs.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
279 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
280 public static final Monoid<Long> longMultiplicationMonoid = monoid(Semigroup.longMultiplicationSemigroup, 1L);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
281
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
282 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
283 * A monoid that ORs booleans.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
284 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
285 public static final Monoid<Boolean> disjunctionMonoid = monoid(Semigroup.disjunctionSemigroup, false);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
286
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
287 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
288 * A monoid that XORs booleans.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
289 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
290 public static final Monoid<Boolean> exclusiveDisjunctionMonoid = monoid(Semigroup.exclusiveDisjunctionSemiGroup, false);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
291
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
292 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
293 * A monoid that ANDs booleans.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
294 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
295 public static final Monoid<Boolean> conjunctionMonoid = monoid(Semigroup.conjunctionSemigroup, true);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
296
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
297 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
298 * A monoid that appends strings.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
299 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
300 public static final Monoid<String> stringMonoid = monoid(Semigroup.stringSemigroup, "");
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
301
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
302 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
303 * A monoid that appends string buffers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
304 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
305 public static final Monoid<StringBuffer> stringBufferMonoid = monoid(Semigroup.stringBufferSemigroup, new StringBuffer());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
306
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
307 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
308 * A monoid that appends string builders.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
309 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
310 public static final Monoid<StringBuilder> stringBuilderMonoid = monoid(Semigroup.stringBuilderSemigroup, new StringBuilder());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
311
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
312 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
313 * A monoid for functions.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
314 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
315 * @param mb The monoid for the function codomain.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
316 * @return A monoid for functions.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
317 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
318 public static <A, B> Monoid<F<A, B>> functionMonoid(final Monoid<B> mb) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
319 return monoid(Semigroup.<A, B>functionSemigroup(mb.semigroup()), Function.<A, B>constant(mb.zero));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
320 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
321
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
322 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
323 * A monoid for lists.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
324 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
325 * @return A monoid for lists.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
326 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
327 public static <A> Monoid<List<A>> listMonoid() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
328 return monoid(Semigroup.<A>listSemigroup(), List.<A>nil());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
329 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
330
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
331 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
332 * A monoid for options.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
333 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
334 * @return A monoid for options.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
335 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
336 public static <A> Monoid<Option<A>> optionMonoid() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
337 return monoid(Semigroup.<A>optionSemigroup(), Option.<A>none());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
338 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
339
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
340 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
341 * A monoid for options that take the first available value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
342 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
343 * @return A monoid for options that take the first available value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
344 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
345 public static <A> Monoid<Option<A>> firstOptionMonoid() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
346 return monoid(Semigroup.<A>firstOptionSemigroup(), Option.<A>none());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
347 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
348
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
349 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
350 * A monoid for options that take the last available value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
351 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
352 * @return A monoid for options that take the last available value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
353 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
354 public static <A> Monoid<Option<A>> lastOptionMonoid() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
355 return monoid(Semigroup.<A>lastOptionSemigroup(), Option.<A>none());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
356 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
357
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
358 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
359 * A monoid for streams.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
360 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
361 * @return A monoid for streams.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
362 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
363 public static <A> Monoid<Stream<A>> streamMonoid() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
364 return monoid(Semigroup.<A>streamSemigroup(), Stream.<A>nil());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
365 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
366
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
367 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
368 * A monoid for arrays.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
369 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
370 * @return A monoid for arrays.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
371 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
372 @SuppressWarnings({"unchecked"})
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
373 public static <A> Monoid<Array<A>> arrayMonoid() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
374 return monoid(Semigroup.<A>arraySemigroup(), Array.<A>empty());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
375 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
376
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
377 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
378 * A monoid for sets.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
379 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
380 * @param o An order for set elements.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
381 * @return A monoid for sets whose elements have the given order.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
382 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
383 public static <A> Monoid<Set<A>> setMonoid(final Ord<A> o) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
384 return monoid(Semigroup.<A>setSemigroup(), Set.empty(o));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
385 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
386
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
387 }