use im_rc::hashset::HashSet; use std::hash::{Hash}; use im_rc::vector::Vector; /// A persistent Set which records insertion order and iterates in that order. pub struct Set { store: HashSet, order: Vector } impl Set where K : std::hash::Hash { pub fn is_empty(self) -> bool { self.store.is_empty() } pub fn insert(self, elem: K) -> Set { let mut new_set: Set = self.clone(); new_set.store.insert(elem); new_set.order.insert(elem); new_set } pub fn map(self, transform: F) -> Set where F: Fn(K) -> B, B: Hash { let mut new_set: Set = Set::new(); for elem in self.order.iter() { if self.store.contains(elem) { new_set.insert(transform(elem)) } } new_set } }