| 22 | } |
| 23 | |
| 24 | pub(super) fn get_or_try_insert_mut<E, F>(&mut self, key: K, init: F) -> Result<&mut V, E> |
| 25 | where |
| 26 | F: FnOnce() -> Result<V, E>, |
| 27 | { |
| 28 | if self.values.contains_key(&key) { |
| 29 | self.touch(key); |
| 30 | return Ok(self |
| 31 | .values |
| 32 | .get_mut(&key) |
| 33 | .expect("cache key must exist after touch")); |
| 34 | } |
| 35 | |
| 36 | if self.values.len() >= self.max_entries { |
| 37 | self.evict_lru(); |
| 38 | } |
| 39 | |
| 40 | let value = init()?; |
| 41 | self.values.insert(key, value); |
| 42 | self.order.push_back(key); |
| 43 | Ok(self |
| 44 | .values |
| 45 | .get_mut(&key) |
| 46 | .expect("cache key must exist after insert")) |
| 47 | } |
| 48 | |
| 49 | fn touch(&mut self, key: K) { |
| 50 | if let Some(pos) = self.order.iter().position(|existing| *existing == key) { |