radiate_utils/stats/
minmax.rs1use 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}