use std::collections::HashMap;
use std::sync::{Arc, Mutex};
#[derive(Default)]
pub(crate) struct PendingFlashes {
ids: Mutex<HashMap<String, usize>>,
}
impl PendingFlashes {
pub(crate) fn new() -> Self {
Self::default()
}
pub(crate) fn contains(&self, id: &str) -> bool {
self.ids.lock().unwrap().contains_key(id)
}
pub(crate) fn begin(self: &Arc<Self>, id: String) -> PendingFlashGuard {
*self.ids.lock().unwrap().entry(id.clone()).or_insert(0) += 1;
PendingFlashGuard {
registry: self.clone(),
id,
}
}
}
pub(crate) struct PendingFlashGuard {
registry: Arc<PendingFlashes>,
id: String,
}
impl Drop for PendingFlashGuard {
fn drop(&mut self) {
let mut ids = self.registry.ids.lock().unwrap();
if let Some(count) = ids.get_mut(&self.id) {
*count -= 1;
if *count == 0 {
ids.remove(&self.id);
}
}
}
}