1 package io.atlassian.fugue.extensions.step;
2
3 import io.atlassian.fugue.Option;
4 import io.atlassian.fugue.extensions.functions.Function4;
5 import io.atlassian.fugue.extensions.functions.Predicate4;
6
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 public final class OptionStep4<A, B, C, D> {
25
26 private final Option<A> option1;
27 private final Option<B> option2;
28 private final Option<C> option3;
29 private final Option<D> option4;
30
31 OptionStep4(Option<A> option1, Option<B> option2, Option<C> option3, Option<D> option4) {
32 this.option1 = option1;
33 this.option2 = option2;
34 this.option3 = option3;
35 this.option4 = option4;
36 }
37
38
39
40
41
42
43
44
45
46
47
48
49 public <E> OptionStep5<A, B, C, D, E> then(Function4<? super A, ? super B, ? super C, ? super D, ? extends Option<? extends E>> functor) {
50 Option<E> option5 = option1.flatMap(value1 -> option2.flatMap(value2 -> option3.flatMap(value3 -> option4.flatMap(value4 -> functor.apply(value1,
51 value2, value3, value4)))));
52 return new OptionStep5<>(option1, option2, option3, option4, option5);
53 }
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69 public <E> OptionStep5<A, B, C, D, E> then(Supplier<? extends Option<? extends E>> supplier) {
70 Option<E> option5 = option1.flatMap(value1 -> option2.flatMap(value2 -> option3.flatMap(value3 -> option4.flatMap(value4 -> supplier.get()))));
71 return new OptionStep5<>(option1, option2, option3, option4, option5);
72 }
73
74
75
76
77
78
79
80
81 public OptionStep4<A, B, C, D> filter(Predicate4<? super A, ? super B, ? super C, ? super D> predicate) {
82 Option<D> filterOption4 = option1.flatMap(value1 -> option2.flatMap(value2 -> option3.flatMap(value3 -> option4.filter(value4 -> predicate.test(
83 value1, value2, value3, value4)))));
84 return new OptionStep4<>(option1, option2, option3, filterOption4);
85 }
86
87
88
89
90
91
92
93
94
95 public <Z> Option<Z> yield(Function4<? super A, ? super B, ? super C, ? super D, Z> functor) {
96 return option1.flatMap(value1 -> option2.flatMap(value2 -> option3.flatMap(value3 -> option4.map(value4 -> functor.apply(value1, value2, value3,
97 value4)))));
98 }
99
100 }