rateslib/dual/dual_ops/
sum.rs

1use crate::dual::dual::{Dual, Dual2};
2use crate::dual::enums::Number;
3use std::iter::Sum;
4
5impl Sum for Dual {
6    fn sum<I>(iter: I) -> Self
7    where
8        I: Iterator<Item = Dual>,
9    {
10        iter.fold(Dual::new(0.0, [].to_vec()), |acc, x| acc + x)
11    }
12}
13
14impl Sum for Dual2 {
15    fn sum<I>(iter: I) -> Self
16    where
17        I: Iterator<Item = Dual2>,
18    {
19        iter.fold(Dual2::new(0.0, Vec::new()), |acc, x| acc + x)
20    }
21}
22
23impl Sum for Number {
24    fn sum<I>(iter: I) -> Self
25    where
26        I: Iterator<Item = Number>,
27    {
28        iter.fold(Number::F64(0.0_f64), |acc, x| acc + x)
29    }
30}
31
32#[cfg(test)]
33mod tests {
34    use super::*;
35
36    #[test]
37    fn test_enum() {
38        let v = vec![
39            Number::F64(2.5_f64),
40            Number::Dual(Dual::new(1.5, vec!["x".to_string()])),
41            Number::Dual(Dual::new(3.5, vec!["x".to_string()])),
42        ];
43        let s: Number = v.into_iter().sum();
44        assert_eq!(
45            s,
46            Number::Dual(Dual::try_new(7.5, vec!["x".to_string()], vec![2.0]).unwrap())
47        );
48    }
49}