use crate::container::Container; use dashmap::DashMap; use std::ops::Deref; use std::sync::{Arc, OnceLock, RwLock}; pub static CONTAINER_CACHE: OnceLock>>>> = OnceLock::new(); pub fn for_cached_containers(f: impl Fn(&dyn Container)) { let containers_cache = CONTAINER_CACHE.get_or_init(Default::default); for container in containers_cache.iter() { if let Ok(guarded_container) = container.read() { f(guarded_container.deref().as_ref()); } } } pub fn for_cached_containers_mut(f: impl Fn(&mut dyn Container)) { let containers_cache = CONTAINER_CACHE.get_or_init(Default::default); for container in containers_cache.iter() { if let Ok(mut guarded_container) = container.write() { f(guarded_container.as_mut()); } } } // TODO: The static lifetime here is a little wierd... (we need it to Box) pub fn add_cached_container(container: impl Container + 'static) { let containers_cache = CONTAINER_CACHE.get_or_init(Default::default); let container_name = container.to_string(); containers_cache.insert(container_name, Arc::new(RwLock::new(Box::new(container)))); } pub fn cached_containers() -> Vec>>> { let containers_cache = CONTAINER_CACHE.get_or_init(Default::default); containers_cache.iter().map(|c| c.clone()).collect() } pub fn cached_container_by_name(name: &str) -> Option>>> { let containers_cache = CONTAINER_CACHE.get_or_init(Default::default); containers_cache.get(name).map(|c| c.clone()) }