// Created on savesnippets.com ยท https://savesnippets.com/AZmSaZTYSNgdP5 struct Fibonacci { a: u64, b: u64, } impl Iterator for Fibonacci { type Item = u64; fn next(&mut self) -> Option { 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 = 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 = fib().take_while(|&n| n < 100).filter(|&n| n % 2 == 0).collect(); println!("{evens_under_100:?}"); // [0, 2, 8, 34] }