use anyhow::{anyhow, Result}; use parking_lot::RwLock; use slab::Slab; use std::sync::{Arc, Weak}; pub struct Registry(RwLock>>); impl Registry { pub fn add(&self, t: T) -> Arc { let t_arc = Arc::new(t); self.add_raw(&t_arc); t_arc } pub fn add_raw(&self, t: &Arc) { self.0.write().insert(Arc::downgrade(t)); } pub fn get_valid_contents(&self) -> Vec> { self.0 .read() .iter() .filter_map(|(_, item)| item.upgrade()) .collect() } pub fn remove(&self, t: &T) { for item in self.0.read().iter() { let (idx, item) = item; if let Some(item) = item.upgrade() { if std::ptr::eq(item.as_ref(), t) { self.0.write().remove(idx); break; } } } } } impl Default for Registry { fn default() -> Self { Registry::(RwLock::new(Slab::new())) } }