1 package io.atlassian.fugue.extensions.step;
2
3 import io.atlassian.fugue.extensions.functions.Function5;
4 import io.atlassian.fugue.extensions.functions.Predicate5;
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
25 @SuppressWarnings("OptionalUsedAsFieldOrParameterType") public final class OptionalStep5<A, B, C, D, E> {
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 private final Optional<E> optional5;
31
32 OptionalStep5(Optional<A> optional1, Optional<B> optional2, Optional<C> optional3, Optional<D> optional4, Optional<E> optional5) {
33 this.optional1 = optional1;
34 this.optional2 = optional2;
35 this.optional3 = optional3;
36 this.optional4 = optional4;
37 this.optional5 = optional5;
38 }
39
40
41
42
43
44
45
46
47
48
49
50
51 public <F> OptionalStep6<A, B, C, D, E, F> then(Function5<? super A, ? super B, ? super C, ? super D, ? super E, Optional<F>> functor) {
52 Optional<F> optional6 = optional1.flatMap(value1 -> optional2.flatMap(value2 -> optional3.flatMap(value3 -> optional4.flatMap(value4 -> optional5
53 .flatMap(value5 -> functor.apply(value1, value2, value3, value4, value5))))));
54 return new OptionalStep6<>(optional1, optional2, optional3, optional4, optional5, optional6);
55 }
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71 public <F> OptionalStep6<A, B, C, D, E, F> then(Supplier<Optional<F>> supplier) {
72 Optional<F> optional6 = optional1.flatMap(value1 -> optional2.flatMap(value2 -> optional3.flatMap(value3 -> optional4.flatMap(value4 -> optional5
73 .flatMap(value5 -> supplier.get())))));
74 return new OptionalStep6<>(optional1, optional2, optional3, optional4, optional5, optional6);
75 }
76
77
78
79
80
81
82
83
84 public OptionalStep5<A, B, C, D, E> filter(Predicate5<? super A, ? super B, ? super C, ? super D, ? super E> predicate) {
85 Optional<E> filterOptional5 = optional1.flatMap(value1 -> optional2.flatMap(value2 -> optional3.flatMap(value3 -> optional4
86 .flatMap(value4 -> optional5.filter(value5 -> predicate.test(value1, value2, value3, value4, value5))))));
87 return new OptionalStep5<>(optional1, optional2, optional3, optional4, filterOptional5);
88 }
89
90
91
92
93
94
95
96
97
98 public <Z> Optional<Z> yield(Function5<? super A, ? super B, ? super C, ? super D, ? super E, Z> functor) {
99 return optional1.flatMap(value1 -> optional2.flatMap(value2 -> optional3.flatMap(value3 -> optional4.flatMap(value4 -> optional5
100 .map(value5 -> functor.apply(value1, value2, value3, value4, value5))))));
101 }
102 }