1macro_rules! merge_opt {
2 ( $m:ident, $( $x:tt ),+ ) => (
3 #[allow(non_snake_case, clippy::too_many_arguments)]
4 pub fn $m<$( $x ),+, F, O>($($x: Option<$x>),+, func: F) -> Option<O>
5 where F: Fn($( Option<$x> ),+) -> Option<O>
6 {
7 func($($x),+)
8 }
9 )
10}
11
12merge_opt!(merge_opt_i2, I1, I2);
13#[cfg(feature = "i3")]
14merge_opt!(merge_opt_i3, I1, I2, I3);
15#[cfg(feature = "i4")]
16merge_opt!(merge_opt_i4, I1, I2, I3, I4);
17#[cfg(feature = "i5")]
18merge_opt!(merge_opt_i5, I1, I2, I3, I4, I5);
19#[cfg(feature = "i6")]
20merge_opt!(merge_opt_i6, I1, I2, I3, I4, I5, I6);
21#[cfg(feature = "i7")]
22merge_opt!(merge_opt_i7, I1, I2, I3, I4, I5, I6, I7);
23#[cfg(feature = "i8")]
24merge_opt!(merge_opt_i8, I1, I2, I3, I4, I5, I6, I7, I8);
25#[cfg(feature = "i9")]
26merge_opt!(merge_opt_i9, I1, I2, I3, I4, I5, I6, I7, I8, I9);
27#[cfg(feature = "i10")]
28merge_opt!(merge_opt_i10, I1, I2, I3, I4, I5, I6, I7, I8, I9, I10);
29
30#[cfg(test)]
31mod tests {
32 use super::*;
33
34 #[test]
35 fn test_i2() {
36 let s1 = Some(1);
37 let s2 = Some(2);
38
39 let merged = merge_opt_i2(s1, s2, |i1, i2| {
40 (i1? + i2?).into()
41 }).unwrap();
42
43 assert_eq!(merged, 3);
44 }
45
46 #[test]
47 fn test_i3() {
48 let s1 = Some(1);
49 let s2 = Some(2);
50 let s3 = Some(3);
51
52 let merged = merge_opt_i3(s1, s2, s3, |i1, i2, i3| {
53 (i1? + i2? + i3?).into()
54 }).unwrap();
55
56 assert_eq!(merged, 6);
57 }
58
59 #[test]
60 fn test_i4() {
61 let s1 = Some(1);
62 let s2 = Some(2);
63 let s3 = Some(3);
64 let s4 = Some(4);
65
66 let merged = merge_opt_i4(s1, s2, s3, s4, |i1, i2, i3, i4| {
67 (i1? + i2? + i3? + i4?).into()
68 }).unwrap();
69
70 assert_eq!(merged, 10);
71 }
72
73 #[test]
74 fn test_i5() {
75 let s1 = Some(1);
76 let s2 = Some(2);
77 let s3 = Some(3);
78 let s4 = Some(4);
79 let s5 = Some(5);
80
81 let merged = merge_opt_i5(s1, s2, s3, s4, s5,|i1, i2, i3, i4, i5| {
82 (i1? + i2? + i3? + i4? + i5?).into()
83 }).unwrap();
84
85 assert_eq!(merged, 15);
86 }
87
88 #[test]
89 fn test_i6() {
90 let s1 = Some(1);
91 let s2 = Some(2);
92 let s3 = Some(3);
93 let s4 = Some(4);
94 let s5 = Some(5);
95 let s6 = Some(6);
96
97 let merged = merge_opt_i6(s1, s2, s3, s4, s5, s6, |i1, i2, i3, i4, i5, i6| {
98 (i1? + i2? + i3? + i4? + i5? + i6?).into()
99 }).unwrap();
100
101 assert_eq!(merged, 21);
102 }
103
104 #[test]
105 fn test_i7() {
106 let s1 = Some(1);
107 let s2 = Some(2);
108 let s3 = Some(3);
109 let s4 = Some(4);
110 let s5 = Some(5);
111 let s6 = Some(6);
112 let s7 = Some(7);
113
114 let merged = merge_opt_i7(s1, s2, s3, s4, s5, s6, s7, |i1, i2, i3, i4, i5, i6, i7| {
115 (i1? + i2? + i3? + i4? + i5? + i6? + i7?).into()
116 }).unwrap();
117
118 assert_eq!(merged, 28);
119 }
120
121 #[test]
122 fn test_i8() {
123 let s1 = Some(1);
124 let s2 = Some(2);
125 let s3 = Some(3);
126 let s4 = Some(4);
127 let s5 = Some(5);
128 let s6 = Some(6);
129 let s7 = Some(7);
130 let s8 = Some(8);
131
132 let merged = merge_opt_i8(s1, s2, s3, s4, s5, s6, s7, s8, |i1, i2, i3, i4, i5, i6, i7, i8| {
133 (i1? + i2? + i3? + i4? + i5? + i6? + i7? + i8?).into()
134 }).unwrap();
135
136 assert_eq!(merged, 36);
137 }
138
139 #[test]
140 fn test_i9() {
141 let s1 = Some(1);
142 let s2 = Some(2);
143 let s3 = Some(3);
144 let s4 = Some(4);
145 let s5 = Some(5);
146 let s6 = Some(6);
147 let s7 = Some(7);
148 let s8 = Some(8);
149 let s9 = Some(9);
150
151 let merged = merge_opt_i9(s1, s2, s3, s4, s5, s6, s7, s8, s9,|i1, i2, i3, i4, i5, i6, i7, i8, i9| {
152 (i1? + i2? + i3? + i4? + i5? + i6? + i7? + i8? + i9?).into()
153 }).unwrap();
154
155 assert_eq!(merged, 45);
156 }
157
158 #[test]
159 fn test_i10() {
160 let s1 = Some(1);
161 let s2 = Some(2);
162 let s3 = Some(3);
163 let s4 = Some(4);
164 let s5 = Some(5);
165 let s6 = Some(6);
166 let s7 = Some(7);
167 let s8 = Some(8);
168 let s9 = Some(9);
169 let s10 = Some(10);
170
171 let merged = merge_opt_i10(s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, |i1, i2, i3, i4, i5, i6, i7, i8, i9, i10| {
172 (i1? + i2? + i3? + i4? + i5? + i6? + i7? + i8? + i9? + i10?).into()
173 }).unwrap();
174
175 assert_eq!(merged, 55);
176 }
177}