sliding_features/pure_functions/
add.rs1use crate::View;
2use num::Float;
3
4#[derive(Debug)]
6pub struct Add<T, A, B> {
7 a: A,
8 b: B,
9 _marker: std::marker::PhantomData<T>,
10}
11
12impl<T, A, B> Add<T, A, B>
13where
14 A: View<T>,
15 B: View<T>,
16 T: Float,
17{
18 #[inline]
20 pub fn new(a: A, b: B) -> Self {
21 Self {
22 a,
23 b,
24 _marker: Default::default(),
25 }
26 }
27}
28
29impl<T, A, B> View<T> for Add<T, A, B>
30where
31 A: View<T>,
32 B: View<T>,
33 T: Float,
34{
35 #[inline]
36 fn update(&mut self, val: T) {
37 debug_assert!(val.is_finite(), "value must be finite");
38 self.a.update(val);
39 self.b.update(val);
40 }
41
42 #[inline]
43 fn last(&self) -> Option<T> {
44 match (self.a.last(), self.b.last()) {
45 (Some(a), Some(b)) => {
46 debug_assert!(a.is_finite(), "value must be finite");
47 debug_assert!(b.is_finite(), "value must be finite");
48 Some(a + b)
49 }
50 (None, None) | (None, Some(_)) | (Some(_), None) => None,
51 }
52 }
53}