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