1 package io.atlassian.fugue.extensions.step;
2
3 import io.atlassian.fugue.extensions.functions.Function4;
4 import io.atlassian.fugue.extensions.functions.Predicate4;
5
6 import java.util.Optional;
7 import java.util.function.Function;
8 import java.util.function.Supplier;
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 @SuppressWarnings("OptionalUsedAsFieldOrParameterType") public final class OptionalStep4<A, B, C, D> {
25
26 private final Optional<A> optional1;
27 private final Optional<B> optional2;
28 private final Optional<C> optional3;
29 private final Optional<D> optional4;
30
31 OptionalStep4(Optional<A> optional1, Optional<B> optional2, Optional<C> optional3, Optional<D> optional4) {
32 this.optional1 = optional1;
33 this.optional2 = optional2;
34 this.optional3 = optional3;
35 this.optional4 = optional4;
36 }
37
38
39
40
41
42
43
44
45
46
47
48
49 public <E> OptionalStep5<A, B, C, D, E> then(Function4<? super A, ? super B, ? super C, ? super D, Optional<E>> functor) {
50 Optional<E> option5 = optional1.flatMap(value1 -> optional2.flatMap(value2 -> optional3.flatMap(value3 -> optional4.flatMap(value4 -> functor
51 .apply(value1, value2, value3, value4)))));
52
53 return new OptionalStep5<>(optional1, optional2, optional3, optional4, option5);
54 }
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70 public <E> OptionalStep5<A, B, C, D, E> then(Supplier<Optional<E>> supplier) {
71 Optional<E> Optional = optional1.flatMap(value1 -> optional2.flatMap(value2 -> optional3.flatMap(value3 -> optional4.flatMap(value4 -> supplier
72 .get()))));
73 return new OptionalStep5<>(optional1, optional2, optional3, optional4, Optional);
74 }
75
76
77
78
79
80
81
82
83 public OptionalStep4<A, B, C, D> filter(Predicate4<? super A, ? super B, ? super C, ? super D> predicate) {
84 Optional<D> filterOptional4 = optional1.flatMap(value1 -> optional2.flatMap(value2 -> optional3.flatMap(value3 -> optional4
85 .filter(value4 -> predicate.test(value1, value2, value3, value4)))));
86 return new OptionalStep4<>(optional1, optional2, optional3, filterOptional4);
87 }
88
89
90
91
92
93
94
95
96
97 public <Z> Optional<Z> yield(Function4<? super A, ? super B, ? super C, ? super D, Z> functor) {
98 return optional1.flatMap(value1 -> optional2.flatMap(value2 -> optional3.flatMap(value3 -> optional4.map(value4 -> functor.apply(value1, value2,
99 value3, value4)))));
100 }
101
102 }