fn main() { let fib_instance = FibItr::default(); println!("{}", fib_instance .filter(is_even) .take_while(|x| *x < 4000000) .sum::() ); } fn is_even(x: &usize) -> bool { x % 2 == 0 } struct FibItr { index: usize, prev: usize } impl Iterator for FibItr { type Item = usize; fn next ( &mut self ) -> Option { let result = self.index + self.prev; self.prev = self.index; self.index = result; return Some(result); } } impl Default for FibItr { fn default() -> Self { FibItr { index: 1, prev: 1 } } }