more_itertools/combining/
dotproduct.rs

1//use crate::itertools::sum::sum;
2
3#[macro_export]
4macro_rules! dotproduct {
5    ($type0:ty, $iter0:expr, $iter1:expr, $init:expr) => {
6        {
7            let mut map_iter = map2($iter0, $iter1, |x, y| {
8                let ret = <$type0>::overflowing_mul(*x, *y);
9                    if ret.1 {
10                        return Err(error::any_error(error::Kind::OverflowError, "multiple overflow.".to_string()));
11                    } else {
12                        return Ok(ret.0);
13                    }
14                });
15            let sum_iter = sum!($type0, map_iter, $init);
16            sum_iter
17        }
18    };
19}
20
21#[cfg(test)]
22mod tests {
23    use crate::error;
24    use crate::itertools::sum::sum;
25    use crate::itertools::map::map2;
26    use crate::utils::generate_okok_iterator;
27
28    #[test]
29    fn test1() {
30        let iter_0 = generate_okok_iterator(vec![10i64,10]);
31        let iter_1 = generate_okok_iterator(vec![20i64,20]);
32        let ret = dotproduct!(i64, iter_0, iter_1, 0i64);
33        assert_eq!(Ok(400i64), ret);
34
35
36        let iter_0 = generate_okok_iterator(vec![10i64,10]);
37        let iter_1 = generate_okok_iterator(vec![20i64,i64::MAX]);
38        let ret = dotproduct!(i64, iter_0, iter_1, 0i64);
39        assert!(ret.err().unwrap().message().unwrap().contains("multiple overflow"));
40    }
41}