use std::any::Any;
pub struct Single<T> {
instance: T,
clone: Option<fn(&T) -> T>,
}
impl<T> Single<T> {
pub(crate) fn new(instance: T, clone: Option<fn(&T) -> T>) -> Self {
Self { instance, clone }
}
pub fn get_owned(&self) -> Option<T> {
self.clone.map(|clone| clone(&self.instance))
}
pub fn get_ref(&self) -> &T {
&self.instance
}
}
pub struct DynSingle {
origin: Box<dyn Any>,
}
impl DynSingle {
pub fn as_single<T: 'static>(&self) -> Option<&Single<T>> {
self.origin.downcast_ref::<Single<T>>()
}
}
impl<T: 'static> From<Single<T>> for DynSingle {
fn from(value: Single<T>) -> Self {
Self {
origin: Box::new(value),
}
}
}