Rust

Custom Iterator Implementation

admin by @admin ADMIN
1d ago
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
Implementing `Iterator` is just supplying a `next() -> Option<Item>`. You automatically gain `map`, `filter`, `collect`, and every other adapter for free.
Rust
Raw
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]
}
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.