CCCPaste

Persistent Stack Iter

use std::borrow::Borrow;
use std::rc::Rc;

struct PStackEntry {
    value: T,
    down: PStack,
}

pub struct PStack(Rc>>);

impl PStack {
    pub fn iter<'a>(&'a self) -> Iter<'a, T> {
        Iter(self)
    }
}

pub struct Iter<'a, T>(&'a PStack);

impl<'a, T> Iterator for Iter<'a, T> {
    type Item = &'a T;

    fn next(&mut self) -> Option {
        match self.0.0.borrow() {
            None => None,
            Some(entry) => {
                self.0 = &entry.down;
                Some(&entry.value)
            }
        }
    }
}