use std::{
collections::HashMap,
sync::{Mutex, OnceLock, PoisonError},
};
use crate::{datatype::NamedDataType, NamedType, SpectaID, TypeCollection};
static TYPES: OnceLock<Mutex<HashMap<SpectaID, fn(&mut TypeCollection) -> NamedDataType>>> =
OnceLock::new();
pub fn export() -> TypeCollection {
let types = TYPES
.get_or_init(Default::default)
.lock()
.unwrap_or_else(PoisonError::into_inner);
let mut map = TypeCollection::default();
for (id, export) in types.iter() {
let dt = export(&mut map);
map.insert(*id, dt);
}
map
}
#[doc(hidden)]
pub mod internal {
use std::sync::PoisonError;
use super::*;
#[doc(hidden)]
pub fn register<T: NamedType>() {
let mut type_map = TYPES
.get_or_init(Default::default)
.lock()
.unwrap_or_else(PoisonError::into_inner);
type_map.insert(T::sid(), |type_map| T::definition_named_data_type(type_map));
}
pub use ctor::ctor;
}