Iterators

    References 🔗

    Blog post on how to use iterator to traverse a tree

    Examples 🔗

    Copied from an example by robjtede @ Actix Web on discord. It was an aside to Tim’s video

    #!/usr/bin/env -S cargo +nightly -Zscript
    ```cargo
    package.edition = "2021" # Desirable to stop warning but not needed
    [dependencies]
    itertools = "0.12.1"
    

    use itertools::Itertools as _;

    fn main() { let pas = Pas::new();

    for row in pas.take(8) {
        println!("{}", row.iter().join(", "));
    }
    

    }

    #[derive(Debug)] struct Pas { row: u32, prev: Vec, }

    impl Pas { fn new() -> Self { Self { row: 0, prev: vec![1], } } }

    impl Iterator for Pas { type Item = Vec;

    fn next(&mut self) -> Option<Self::Item> {
        self.row += 1;
    
        if self.row == 1 {
            return Some(self.prev.clone());
        }
    
        self.prev.insert(0, 0);
        self.prev.push(0);
    
        self.prev = self
            .prev
            .iter()
            .tuple_windows()
            .map(|(a, b)| a + b)
            .collect();
    
        Some(self.prev.clone())
    }
    

    }