rateslib/dual/dual_ops/
sum.rs1use 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}