1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
use std::cmp::Ordering;
use signalo_traits::sink::Sink;
#[derive(Clone, Default, Debug)]
pub struct Min<T> {
min: Option<T>,
}
impl<T> Sink<T> for Min<T>
where
T: Copy + PartialOrd,
{
type Output = Option<T>;
#[inline]
fn sink(&mut self, input: T) {
self.min = match self.min {
Some(min) => match min.partial_cmp(&input) {
Some(Ordering::Greater) => Some(input),
_ => Some(min),
},
None => Some(input),
};
}
#[inline]
fn finalize(self) -> Self::Output {
self.min
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test() {
let input = vec![
0, 1, 7, 2, 5, 8, 16, 3, 19, 6, 14, 9, 9, 17, 17, 4, 12, 20, 20, 7,
];
let mut sink = Min::default();
for input in input {
sink.sink(input);
}
let min = sink.finalize().unwrap();
assert_eq!(min, 0);
}
}