struct Fibonacci { curr: u32, next: u32, } impl Iterator for Fibonacci { type Item = u32; fn next(&mut self) -> Option { let new = self.curr + self.next; self.curr = self.next; self.next = new; Some(self.curr) } } fn fibonacci() -> Fibonacci { Fibonacci { curr: 1, next: 1 } } fn fibonacci_sum_up_to(number: u32) -> u32 { return fibonacci().take_while(|n| n < &number).filter(|n| n % 2 == 0).sum(); } fn solution() -> u32 { return fibonacci_sum_up_to(4000000); } #[cfg(test)] mod tests { use euler::problem_002::solution; #[test] fn problem_002() { assert_eq!(solution(), 4613732); } }