Skip to main content

radiate_utils/stats/
minmax.rs

1use crate::Primitive;
2
3pub struct MinMax<T: Primitive> {
4    min: T,
5    max: T,
6}
7
8impl<T: Primitive> MinMax<T> {
9    pub fn min(&self) -> T {
10        self.min
11    }
12
13    pub fn max(&self) -> T {
14        self.max
15    }
16
17    pub fn min_max(&self) -> (T, T) {
18        (self.min, self.max)
19    }
20
21    pub fn range(&self) -> T {
22        self.max - self.min
23    }
24
25    #[inline]
26    pub fn add(&mut self, value: &T) {
27        if value < &self.min {
28            self.min = *value;
29        }
30
31        if value > &self.max {
32            self.max = *value;
33        }
34    }
35}
36
37impl<T: Primitive> Default for MinMax<T> {
38    fn default() -> Self {
39        MinMax {
40            min: T::MAX,
41            max: T::MIN,
42        }
43    }
44}
45
46impl<T> FromIterator<T> for MinMax<T>
47where
48    T: Primitive,
49{
50    fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
51        let mut min_max = MinMax::default();
52
53        for value in iter {
54            min_max.add(&value);
55        }
56
57        min_max
58    }
59}
60
61impl<'a, T> FromIterator<&'a T> for MinMax<T>
62where
63    T: Primitive,
64{
65    fn from_iter<I: IntoIterator<Item = &'a T>>(iter: I) -> Self {
66        let mut min_max = MinMax::default();
67
68        for value in iter {
69            min_max.add(value);
70        }
71
72        min_max
73    }
74}