struct Fibonacci {
a: u64,
b: u64,
}
impl Iterator for Fibonacci {
type Item = u64;
fn next(&mut self) -> Option<Self::Item> {
let out = self.a;
let next = self.a.checked_add(self.b)?; // None on overflow
self.a = self.b;
self.b = next;
Some(out)
}
}
fn fib() -> Fibonacci { Fibonacci { a: 0, b: 1 } }
fn main() {
let first_10: Vec<u64> = fib().take(10).collect();
println!("{first_10:?}"); // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
// We get all the adapters for free
let sum_first_30: u64 = fib().take(30).sum();
println!("sum = {sum_first_30}");
let evens_under_100: Vec<u64> = fib().take_while(|&n| n < 100).filter(|&n| n % 2 == 0).collect();
println!("{evens_under_100:?}"); // [0, 2, 8, 34]
}
Create a free account and build your private vault. Share publicly whenever you want.