use dashmap::DashMap;
use std::any::{Any, TypeId};
use std::sync::Arc;
#[derive(Debug, Default, Clone)]
pub struct Resources {
inner: DashMap<TypeId, Arc<dyn Any + Send + Sync>>,
}
impl Resources {
pub fn new() -> Self {
Self {
inner: DashMap::new(),
}
}
pub fn insert<T: Any + Send + Sync>(&self, value: T) -> &Self {
self.inner.insert(TypeId::of::<T>(), Arc::new(value));
self
}
pub fn insert_arc<T: Any + Send + Sync>(&self, value: Arc<T>) -> &Self {
self.inner.insert(TypeId::of::<Arc<T>>(), Arc::new(value));
self
}
pub fn get<T: Any + Send + Sync>(&self) -> Option<Arc<T>> {
let value = self.inner.get(&TypeId::of::<T>())?;
Arc::clone(value.value()).downcast::<T>().ok()
}
pub fn get_arc<T: Any + Send + Sync>(&self) -> Option<Arc<T>> {
let value = self.inner.get(&TypeId::of::<Arc<T>>())?;
let value = Arc::clone(value.value()).downcast::<Arc<T>>().ok()?;
Some((*value).clone())
}
}