use std::ops::Deref; use num_traits::Bounded; // Alternate impl as an iterator fn main() { let a = vec![7, 8, 3, 12, 10]; let o: Vec = doit(&a); assert_eq!(o, vec![0, 7, 0, 3, 3]); let a = vec![4, 6, 5]; let o: Vec = doit(&a); assert_eq!(o, vec![0, 4, 4]); } fn doit(a: &Vec) -> Vec { MinLeft::new(a.iter()).collect() } struct MinLeft { a: I, min: T, } impl MinLeft { fn new(a: I) -> MinLeft { MinLeft { a, min: T::max_value(), } } } impl<'a, T: Bounded + Copy + Ord + Default, P: Deref, I: Iterator> Iterator for MinLeft { type Item = T; fn next(&mut self) -> Option { match self.a.next() { Some(next) => { let result = if self.min < *next { self.min } else { Default::default() }; self.min = self.min.min(*next); Some(result) }, None => None } } }