annotate src/main/java/fj/Semigroup.java @ 1:8ed7d71e8617

minner change
author tatsuki
date Sat, 21 Mar 2015 05:32:16 +0900
parents fe80c1edf1be
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
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
5 import fj.data.Array;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
6 import fj.data.List;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
7 import fj.data.Natural;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
8 import fj.data.NonEmptyList;
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
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
13 import java.math.BigInteger;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
14 import java.math.BigDecimal;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
15
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
16 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
17 * Implementations must satisfy the law of associativity:
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
18 * <ul>
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
19 * <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
20 * </ul>
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
21 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
22 * @version %build.number%
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
23 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
24 public final class Semigroup<A> {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
25 private final F<A, F<A, A>> sum;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
26
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
27 private Semigroup(final F<A, F<A, A>> sum) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
28 this.sum = sum;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
29 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
30
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
31 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
32 * Sums the two given arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
33 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
34 * @param a1 A value to sum with another.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
35 * @param a2 A value to sum with another.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
36 * @return The of the two given arguments.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
37 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
38 public A sum(final A a1, final A a2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
39 return sum.f(a1).f(a2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
40 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
41
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
42 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
43 * Returns a function that sums the given value according to this semigroup.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
44 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
45 * @param a1 The value to sum.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
46 * @return A function that sums the given value according to this semigroup.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
47 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
48 public F<A, A> sum(final A a1) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
49 return sum.f(a1);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
50 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
51
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
52 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
53 * Returns a function that sums according to this semigroup.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
54 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
55 * @return A function that sums according to this semigroup.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
56 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
57 public F<A, F<A, A>> sum() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
58 return sum;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
59 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
60
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
61 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
62 * Constructs a semigroup from the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
63 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
64 * @param sum The function to construct this semigroup with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
65 * @return A semigroup from the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
66 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
67 public static <A> Semigroup<A> semigroup(final F<A, F<A, A>> sum) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
68 return new Semigroup<A>(sum);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
69 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
70
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
71 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
72 * Constructs a semigroup from the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
73 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
74 * @param sum The function to construct this semigroup with.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
75 * @return A semigroup from the given function.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
76 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
77 public static <A> Semigroup<A> semigroup(final F2<A, A, A> sum) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
78 return new Semigroup<A>(curry(sum));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
79 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
80
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
81 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
82 * A semigroup that adds integers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
83 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
84 public static final Semigroup<Integer> intAdditionSemigroup = semigroup(new F2<Integer, Integer, Integer>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
85 public Integer f(final Integer i1, final Integer i2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
86 return i1 + i2;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
87 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
88 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
89
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
90 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
91 * A semigroup that adds doubles.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
92 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
93 public static final Semigroup<Double> doubleAdditionSemigroup = semigroup(new F2<Double, Double, Double>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
94 public Double f(final Double d1, final Double d2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
95 return d1 + d2;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
96 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
97 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
98
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
99 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
100 * A semigroup that multiplies integers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
101 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
102 public static final Semigroup<Integer> intMultiplicationSemigroup = semigroup(new F2<Integer, Integer, Integer>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
103 public Integer f(final Integer i1, final Integer i2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
104 return i1 * i2;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
105 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
106 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
107
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
108 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
109 * A semigroup that multiplies doubles.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
110 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
111 public static final Semigroup<Double> doubleMultiplicationSemigroup = semigroup(new F2<Double, Double, Double>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
112 public Double f(final Double d1, final Double d2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
113 return d1 * d2;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
114 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
115 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
116
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
117 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
118 * A semigroup that yields the maximum of integers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
119 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
120 public static final Semigroup<Integer> intMaximumSemigroup = semigroup(Ord.intOrd.max);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
121
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
122 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
123 * A semigroup that yields the minimum of integers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
124 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
125 public static final Semigroup<Integer> intMinimumSemigroup = semigroup(Ord.intOrd.min);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
126
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
127 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
128 * A semigroup that adds big integers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
129 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
130 public static final Semigroup<BigInteger> bigintAdditionSemigroup =
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
131 semigroup(new F2<BigInteger, BigInteger, BigInteger>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
132 public BigInteger f(final BigInteger i1, final BigInteger i2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
133 return i1.add(i2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
134 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
135 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
136
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
137 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
138 * A semigroup that multiplies big integers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
139 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
140 public static final Semigroup<BigInteger> bigintMultiplicationSemigroup =
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
141 semigroup(new F2<BigInteger, BigInteger, BigInteger>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
142 public BigInteger f(final BigInteger i1, final BigInteger i2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
143 return i1.multiply(i2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
144 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
145 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
146
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
147 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
148 * A semigroup that yields the maximum of big integers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
149 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
150 public static final Semigroup<BigInteger> bigintMaximumSemigroup = semigroup(Ord.bigintOrd.max);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
151
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
152 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
153 * A semigroup that yields the minimum of big integers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
154 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
155 public static final Semigroup<BigInteger> bigintMinimumSemigroup = semigroup(Ord.bigintOrd.min);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
156
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
157 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
158 * A semigroup that adds big decimals.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
159 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
160 public static final Semigroup<BigDecimal> bigdecimalAdditionSemigroup =
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
161 semigroup(new F2<BigDecimal, BigDecimal, BigDecimal>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
162 public BigDecimal f(final BigDecimal i1, final BigDecimal i2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
163 return i1.add(i2);
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 * A semigroup that multiplies big decimals.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
169 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
170 public static final Semigroup<BigDecimal> bigdecimalMultiplicationSemigroup =
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
171 semigroup(new F2<BigDecimal, BigDecimal, BigDecimal>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
172 public BigDecimal f(final BigDecimal i1, final BigDecimal i2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
173 return i1.multiply(i2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
174 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
175 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
176
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
177 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
178 * A semigroup that yields the maximum of big decimals.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
179 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
180 public static final Semigroup<BigDecimal> bigDecimalMaximumSemigroup = semigroup(Ord.bigdecimalOrd.max);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
181
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
182 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
183 * A semigroup that yields the minimum of big decimals.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
184 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
185 public static final Semigroup<BigDecimal> bigDecimalMinimumSemigroup = semigroup(Ord.bigdecimalOrd.min);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
186
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
187 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
188 * A semigroup that multiplies natural numbers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
189 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
190 public static final Semigroup<Natural> naturalMultiplicationSemigroup =
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
191 semigroup(new F2<Natural, Natural, Natural>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
192 public Natural f(final Natural n1, final Natural n2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
193 return n1.multiply(n2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
194 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
195 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
196
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
197 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
198 * A semigroup that multiplies natural numbers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
199 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
200 public static final Semigroup<Natural> naturalAdditionSemigroup =
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
201 semigroup(new F2<Natural, Natural, Natural>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
202 public Natural f(final Natural n1, final Natural n2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
203 return n1.add(n2);
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 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
208 * A semigroup that yields the maximum of natural numbers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
209 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
210 public static final Semigroup<Natural> naturalMaximumSemigroup = semigroup(Ord.naturalOrd.max);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
211
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
212 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
213 * A semigroup that yields the minimum of natural numbers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
214 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
215 public static final Semigroup<Natural> naturalMinimumSemigroup = semigroup(Ord.naturalOrd.min);
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 semigroup that adds longs.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
219 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
220 public static final Semigroup<Long> longAdditionSemigroup = semigroup(new F2<Long, Long, Long>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
221 public Long f(final Long x, final Long y) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
222 return x + y;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
223 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
224 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
225
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
226 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
227 * A semigroup that multiplies longs.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
228 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
229 public static final Semigroup<Long> longMultiplicationSemigroup = semigroup(new F2<Long, Long, Long>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
230 public Long f(final Long x, final Long y) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
231 return x * y;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
232 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
233 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
234
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
235 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
236 * A semigroup that yields the maximum of longs.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
237 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
238 public static final Semigroup<Long> longMaximumSemigroup = semigroup(Ord.longOrd.max);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
239
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
240 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
241 * A semigroup that yields the minimum of longs.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
242 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
243 public static final Semigroup<Long> longMinimumSemigroup = semigroup(Ord.longOrd.min);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
244
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
245 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
246 * A semigroup that ORs booleans.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
247 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
248 public static final Semigroup<Boolean> disjunctionSemigroup = semigroup(new F2<Boolean, Boolean, Boolean>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
249 public Boolean f(final Boolean b1, final Boolean b2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
250 return b1 || b2;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
251 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
252 });
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 semigroup that XORs booleans.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
256 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
257 public static final Semigroup<Boolean> exclusiveDisjunctionSemiGroup = semigroup(new F2<Boolean, Boolean, Boolean>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
258 public Boolean f(final Boolean p, final Boolean q) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
259 return p && !q || !p && q;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
260 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
261 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
262
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
263 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
264 * A semigroup that ANDs booleans.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
265 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
266 public static final Semigroup<Boolean> conjunctionSemigroup = semigroup(new F2<Boolean, Boolean, Boolean>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
267 public Boolean f(final Boolean b1, final Boolean b2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
268 return b1 && b2;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
269 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
270 });
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 semigroup that appends strings.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
274 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
275 public static final Semigroup<String> stringSemigroup = semigroup(new F2<String, String, String>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
276 public String f(final String s1, final String s2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
277 return s1 + s2;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
278 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
279 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
280
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
281 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
282 * A semigroup that appends string buffers.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
283 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
284 public static final Semigroup<StringBuffer> stringBufferSemigroup =
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
285 semigroup(new F2<StringBuffer, StringBuffer, StringBuffer>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
286 public StringBuffer f(final StringBuffer s1, final StringBuffer s2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
287 return new StringBuffer(s1).append(s2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
288 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
289 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
290
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
291 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
292 * A semigroup that appends string builders.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
293 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
294 public static final Semigroup<StringBuilder> stringBuilderSemigroup =
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
295 semigroup(new F2<StringBuilder, StringBuilder, StringBuilder>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
296 public StringBuilder f(final StringBuilder s1, final StringBuilder s2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
297 return new StringBuilder(s1).append(s2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
298 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
299 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
300
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
301 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
302 * A semigroup for functions.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
303 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
304 * @param sb The smeigroup for the codomain.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
305 * @return A semigroup for functions.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
306 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
307 public static <A, B> Semigroup<F<A, B>> functionSemigroup(final Semigroup<B> sb) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
308 return semigroup(new F2<F<A, B>, F<A, B>, F<A, B>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
309 public F<A, B> f(final F<A, B> a1, final F<A, B> a2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
310 return new F<A, B>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
311 public B f(final A a) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
312 return sb.sum(a1.f(a), a2.f(a));
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
313 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
314 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
315 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
316 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
317 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
318
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
319 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
320 * A semigroup for lists.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
321 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
322 * @return A semigroup for lists.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
323 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
324 public static <A> Semigroup<List<A>> listSemigroup() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
325 return semigroup(new F2<List<A>, List<A>, List<A>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
326 public List<A> f(final List<A> a1, final List<A> a2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
327 return a1.append(a2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
328 }
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 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
333 * A semigroup for non-empty lists.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
334 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
335 * @return A semigroup for non-empty lists.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
336 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
337 public static <A> Semigroup<NonEmptyList<A>> nonEmptyListSemigroup() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
338 return semigroup(new F2<NonEmptyList<A>, NonEmptyList<A>, NonEmptyList<A>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
339 public NonEmptyList<A> f(final NonEmptyList<A> a1, final NonEmptyList<A> a2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
340 return a1.append(a2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
341 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
342 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
343 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
344
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
345 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
346 * A semigroup for optional values.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
347 ** @return A semigroup for optional values.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
348 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
349 public static <A> Semigroup<Option<A>> optionSemigroup() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
350 return semigroup(new F2<Option<A>, Option<A>, Option<A>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
351 public Option<A> f(final Option<A> a1, final Option<A> a2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
352 return a1.isSome() ? a1 : a2;
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
353 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
354 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
355 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
356
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
357 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
358 * A semigroup for optional values that take the first available value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
359 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
360 * @return A semigroup for optional values that take the first available value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
361 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
362 public static <A> Semigroup<Option<A>> firstOptionSemigroup() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
363 return semigroup(new F2<Option<A>, Option<A>, Option<A>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
364 public Option<A> f(final Option<A> a1, final Option<A> a2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
365 return a1.orElse(a2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
366 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
367 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
368 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
369
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
370 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
371 * A semigroup for optional values that take the last available value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
372 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
373 * @return A semigroup for optional values that take the last available value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
374 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
375 public static <A> Semigroup<Option<A>> lastOptionSemigroup() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
376 return semigroup(new F2<Option<A>, Option<A>, Option<A>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
377 public Option<A> f(final Option<A> a1, final Option<A> a2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
378 return a2.orElse(a1);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
379 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
380 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
381 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
382
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
383 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
384 * A semigroup for streams.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
385 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
386 * @return A semigroup for streams.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
387 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
388 public static <A> Semigroup<Stream<A>> streamSemigroup() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
389 return semigroup(new F2<Stream<A>, Stream<A>, Stream<A>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
390 public Stream<A> f(final Stream<A> a1, final Stream<A> a2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
391 return a1.append(a2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
392 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
393 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
394 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
395
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
396 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
397 * A semigroup for arrays.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
398 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
399 * @return A semigroup for arrays.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
400 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
401 public static <A> Semigroup<Array<A>> arraySemigroup() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
402 return semigroup(new F2<Array<A>, Array<A>, Array<A>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
403 public Array<A> f(final Array<A> a1, final Array<A> a2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
404 return a1.append(a2);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
405 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
406 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
407 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
408
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
409 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
410 * A semigroup for unary products.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
411 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
412 * @param sa A semigroup for the product's type.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
413 * @return A semigroup for unary products.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
414 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
415 public static <A> Semigroup<P1<A>> p1Semigroup(final Semigroup<A> sa) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
416 return semigroup(new F2<P1<A>, P1<A>, P1<A>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
417 public P1<A> f(final P1<A> a1, final P1<A> a2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
418 return new P1<A>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
419 public A _1() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
420 return sa.sum(a1._1(), a2._1());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
421 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
422 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
423 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
424 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
425 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
426
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
427 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
428 * A semigroup for binary products.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
429 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
430 * @param sa A semigroup for the product's first type.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
431 * @param sb A semigroup for the product's second type.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
432 * @return A semigroup for binary products.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
433 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
434 public static <A, B> Semigroup<P2<A, B>> p2Semigroup(final Semigroup<A> sa, final Semigroup<B> sb) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
435 return semigroup(new F2<P2<A, B>, P2<A, B>, P2<A, B>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
436 public P2<A, B> f(final P2<A, B> a1, final P2<A, B> a2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
437 return new P2<A, B>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
438 public A _1() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
439 return sa.sum(a1._1(), a2._1());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
440 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
441
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
442 public B _2() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
443 return sb.sum(a1._2(), a2._2());
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
444 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
445 };
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
446 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
447 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
448 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
449
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
450 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
451 * A semigroup for the Unit value.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
452 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
453 public static final Semigroup<Unit> unitSemigroup = semigroup(new F2<Unit, Unit, Unit>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
454 public Unit f(final Unit u1, final Unit u2) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
455 return Unit.unit();
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
456 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
457 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
458
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
459 /**
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
460 * A semigroup for sets.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
461 *
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
462 * @return a semigroup for sets.
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
463 */
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
464 public static <A> Semigroup<Set<A>> setSemigroup() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
465 return semigroup(new F2<Set<A>, Set<A>, Set<A>>() {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
466 public Set<A> f(final Set<A> a, final Set<A> b) {
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
467 return a.union(b);
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
468 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
469 });
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
470 }
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
471
fe80c1edf1be add getLoop
tatsuki
parents:
diff changeset
472 }