sliding_features/pure_functions/
add.rs

1use crate::View;
2use num::Float;
3
4/// Add View a to b
5#[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    /// Create a new instance with Views a and b
19    #[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}