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
#![feature(test)] extern crate num; #[cfg(test)] mod test; use num::{Zero, One, CheckedAdd}; use std::fmt::Debug; #[derive(Debug)] pub struct Fibonacci<T> { last_two: (T, T) } impl<T> Default for Fibonacci<T> where T: Debug + Zero + One { fn default() -> Self { Fibonacci { last_two: (T::zero(), T::one()) } } } impl<T> Iterator for Fibonacci<T> where T: Debug + CheckedAdd + Clone { type Item = T; fn next(&mut self) -> Option<Self::Item> { let n = self.last_two.0.checked_add(&self.last_two.1); if let Some(ref x) = n { std::mem::swap(&mut self.last_two.0, &mut self.last_two.1); self.last_two.1 = x.clone(); } n } }