use std::sync::{Once, RwLock, RwLockReadGuard};
pub struct RefreshableSingleton<T> {
data: RwLock<Option<T>>,
default_load: Once,
}
impl<T> RefreshableSingleton<T> {
pub const fn new() -> Self {
Self {
data: RwLock::new(None),
default_load: Once::new(),
}
}
pub fn ensure_default_loaded(&self, loader: impl FnOnce() -> Option<T>) {
self.default_load.call_once(|| {
if let Some(v) = loader() {
*self.data.write().unwrap() = Some(v);
}
});
}
pub fn set(&self, value: T) {
self.default_load.call_once(|| {});
*self.data.write().unwrap() = Some(value);
}
pub fn read(&self) -> RwLockReadGuard<'_, Option<T>> {
self.data.read().unwrap()
}
}
impl<T> Default for RefreshableSingleton<T> {
fn default() -> Self {
Self::new()
}
}