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) } } } }