- pub fn values<T>(&self, f: impl FnOnce(&mut Iterator<Item=&V>) -> T) -> T {
- f(&mut self.0.borrow().values().map(|v| &**v))
+ /// This function exists for priroda to be able to iterate over all evaluator memory.
+ ///
+ /// The function is somewhat roundabout with the closure argument because internally the
+ /// `MonoHashMap` uses a `RefCell`. When iterating over the `FxHashMap` inside the `RefCell`,
+ /// we need to keep a borrow to the `FxHashMap` inside the iterator. The borrow is only alive
+ /// as long as the `Ref` returned by `RefCell::borrow()` is alive. So we can't return the
+ /// iterator, as that would drop the `Ref`. We can't return both, as it's not possible in Rust
+ /// to have a struct/tuple with a field that refers to another field.
+ pub fn iter<T>(&self, f: impl FnOnce(&mut dyn Iterator<Item = (&K, &V)>) -> T) -> T {
+ f(&mut self.0.borrow().iter().map(|(k, v)| (k, &**v)))