merge_opt/
lib.rs

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}