1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package io.atlassian.fugue;
17
18 import java.io.Serializable;
19 import java.util.Iterator;
20 import java.util.NoSuchElementException;
21 import java.util.Objects;
22 import java.util.Optional;
23 import java.util.function.Consumer;
24 import java.util.function.Function;
25 import java.util.function.Predicate;
26 import java.util.function.Supplier;
27 import java.util.stream.Stream;
28
29 import static io.atlassian.fugue.Suppliers.ofInstance;
30 import static java.util.Objects.requireNonNull;
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64 public abstract class Option<A> implements Iterable<A>, Maybe<A>, Serializable {
65 private static final long serialVersionUID = 7849097310208471377L;
66
67
68
69
70
71
72
73
74 public static <A> Option<A> option(final A a) {
75 return (a == null) ? Option.<A> none() : new Some<>(a);
76 }
77
78
79
80
81
82
83
84
85
86 public static <A> Option<A> some(final A value) {
87 requireNonNull(value);
88 return new Some<>(value);
89 }
90
91
92
93
94
95
96
97 public static <A> Option<A> none() {
98 @SuppressWarnings("unchecked")
99 final Option<A> result = (Option<A>) None.NONE;
100 return result;
101 }
102
103
104
105
106
107
108
109
110
111
112 public static <A> Option<A> none(final Class<A> type) {
113 return none();
114 }
115
116
117
118
119
120
121
122
123 public static <A> Predicate<Option<A>> defined() {
124 return Maybe::isDefined;
125 }
126
127
128
129
130
131
132
133 public static <A> Supplier<Option<A>> noneSupplier() {
134 return ofInstance(Option.<A> none());
135 }
136
137
138
139
140
141
142
143
144
145
146 public static <A> Option<A> fromOptional(final Optional<A> optional) {
147 return option(optional.orElse(null));
148 }
149
150
151
152
153
154
155 Option() {}
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170 public abstract <B> B fold(Supplier<? extends B> none, Function<? super A, ? extends B> some);
171
172
173
174
175
176
177 @Override public final <B extends A> A getOrElse(final B other) {
178 return getOr(Suppliers.<A> ofInstance(other));
179 }
180
181
182 @Override public final A getOr(final Supplier<? extends A> supplier) {
183 return fold(supplier, Functions.<A> identity());
184 }
185
186
187 @Deprecated @Override public final A getOrElse(final Supplier<? extends A> supplier) {
188 return fold(supplier, Functions.<A> identity());
189 }
190
191
192 @Override public final A getOrNull() {
193 return fold(Suppliers.<A> alwaysNull(), Functions.<A> identity());
194 }
195
196
197
198
199
200
201
202
203 public final Option<A> orElse(final Option<? extends A> orElse) {
204 return orElse(ofInstance(orElse));
205 }
206
207
208
209
210
211
212
213
214
215 public final Option<A> orElse(final Supplier<? extends Option<? extends A>> orElse) {
216 @SuppressWarnings("unchecked")
217
218 final Option<A> result = (Option<A>) fold(orElse, Options.toOption());
219 return result;
220 }
221
222
223 @Override public final boolean exists(final Predicate<? super A> p) {
224 requireNonNull(p);
225 return isDefined() && p.test(get());
226 }
227
228
229 @Override public final boolean forall(final Predicate<? super A> p) {
230 requireNonNull(p);
231 return isEmpty() || p.test(get());
232 }
233
234
235 @Override public final boolean isEmpty() {
236 return !isDefined();
237 }
238
239
240 @Override public final Iterator<A> iterator() {
241 return fold(ofInstance(Iterators.<A> emptyIterator()), Iterators::<A> singletonIterator);
242 }
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257 public final <B> Option<B> map(final Function<? super A, ? extends B> f) {
258 requireNonNull(f);
259 return isEmpty() ? Option.<B> none() : new Some<>(f.apply(get()));
260 }
261
262
263
264
265
266
267
268
269
270
271 public final <B> Option<B> flatMap(final Function<? super A, ? extends Option<? extends B>> f) {
272 requireNonNull(f);
273 @SuppressWarnings("unchecked")
274 final Option<B> result = (Option<B>) fold(Option.<B> noneSupplier(), f);
275 return result;
276 }
277
278
279
280
281
282
283
284
285
286 public final Option<A> filter(final Predicate<? super A> p) {
287 requireNonNull(p);
288 return (isEmpty() || p.test(get())) ? this : Option.<A> none();
289 }
290
291
292
293
294
295
296
297
298
299
300
301 public final <X> Either<X, A> toRight(final Supplier<X> left) {
302 return isEmpty() ? Either.<X, A> left(left.get()) : Either.<X, A> right(get());
303 }
304
305
306
307
308
309
310
311
312
313
314
315 public final <X> Either<A, X> toLeft(final Supplier<X> right) {
316 return isEmpty() ? Either.<A, X> right(right.get()) : Either.<A, X> left(get());
317 }
318
319
320
321
322
323
324
325
326
327 public abstract Optional<A> toOptional();
328
329
330
331
332
333
334
335
336 public abstract Stream<A> toStream();
337
338
339 @Override public final int hashCode() {
340 return fold(NONE_HASH, SOME_HASH);
341 }
342
343
344 @Override public final boolean equals(final Object obj) {
345 if (this == obj) {
346 return true;
347 }
348 if ((obj == null) || !(obj instanceof Option<?>)) {
349 return false;
350 }
351 final Option<?> other = (Option<?>) obj;
352 return other.fold(isDefined() ? Suppliers.alwaysFalse() : Suppliers.alwaysTrue(), valuesEqual());
353 }
354
355
356 @Override public final String toString() {
357 return fold(NONE_STRING, SOME_STRING);
358 }
359
360
361
362
363
364 private Function<Object, Boolean> valuesEqual() {
365 return obj -> isDefined() && Objects.equals(get(), obj);
366 }
367
368
369
370
371
372 private static final Supplier<String> NONE_STRING = ofInstance("none()");
373 private static final Supplier<Integer> NONE_HASH = ofInstance(31);
374
375 private static final Function<Object, String> SOME_STRING = obj -> String.format("some(%s)", obj);
376 private static final Function<Object, Integer> SOME_HASH = Object::hashCode;
377
378
379
380
381
382
383
384
385
386
387 static final class None extends Option<Object> {
388 private static final long serialVersionUID = -1978333494161467110L;
389
390 private static final Option<Object> NONE = new None();
391
392 @Override public <B> B fold(final Supplier<? extends B> none, final Function<? super Object, ? extends B> some) {
393 return none.get();
394 }
395
396 @Override public Object get() {
397 throw new NoSuchElementException();
398 }
399
400 @Override public boolean isDefined() {
401 return false;
402 }
403
404 @Override public Object getOrError(final Supplier<String> err) {
405 throw new AssertionError(err.get());
406 }
407
408 @Override public <X extends Throwable> Object getOrThrow(final Supplier<X> ifUndefined) throws X {
409 throw ifUndefined.get();
410 }
411
412 @Deprecated @Override public void foreach(final Effect<? super Object> effect) {
413 this.forEach(effect);
414 }
415
416 @Override public void forEach(final Consumer<? super Object> effect) {}
417
418 @Override public Optional<Object> toOptional() {
419 return Optional.empty();
420 }
421
422 @Override public Stream<Object> toStream() {
423 return Stream.empty();
424 }
425
426 private Object readResolve() {
427 return None.NONE;
428 }
429 }
430
431
432
433
434 static final class Some<A> extends Option<A> {
435 private static final long serialVersionUID = 5542513144209030852L;
436
437 private final A value;
438
439 private Some(final A value) {
440 this.value = value;
441 }
442
443 @Override public <B> B fold(final Supplier<? extends B> none, final Function<? super A, ? extends B> f) {
444 return f.apply(value);
445 }
446
447 @Override public A get() {
448 return value;
449 }
450
451 @Override public boolean isDefined() {
452 return true;
453 }
454
455 @Override public A getOrError(final Supplier<String> err) {
456 return get();
457 }
458
459 @Override public <X extends Throwable> A getOrThrow(final Supplier<X> ifUndefined) throws X {
460 return get();
461 }
462
463 @Deprecated @Override public void foreach(final Effect<? super A> effect) {
464 this.forEach(effect);
465 }
466
467 @Override public void forEach(final Consumer<? super A> effect) {
468 effect.accept(value);
469 }
470
471 @Override public Optional<A> toOptional() {
472 return Optional.of(value);
473 }
474
475 @Override public Stream<A> toStream() {
476 return Stream.of(value);
477 }
478 }
479
480
481
482
483
484
485
486 @Deprecated private static final Serializable NONE = new Serializable() {
487 private static final long serialVersionUID = -1978333494161467110L;
488
489 private Object readResolve() {
490 return None.NONE;
491 }
492 };
493
494 }