diff --git a/src/core/mod.rs b/src/core/mod.rs index 91c4c83..a38a168 100644 --- a/src/core/mod.rs +++ b/src/core/mod.rs @@ -1,3 +1,4 @@ pub mod client; pub mod eventloop; +pub mod registry; pub mod scenegraph; diff --git a/src/core/registry.rs b/src/core/registry.rs new file mode 100644 index 0000000..81bb528 --- /dev/null +++ b/src/core/registry.rs @@ -0,0 +1,40 @@ +use anyhow::{anyhow, Result}; +use slab::{Iter, Slab}; +use std::sync::RwLock; + +struct Registry(RwLock>); + +impl Registry { + pub fn add(&self, t: T) -> Result { + Ok(self + .0 + .write() + .ok() + .ok_or_else(|| anyhow!("Registry has been poisoned"))? + .insert(t)) + } + pub fn iterate)>(&self, index: usize, closure: F) -> Result<()> { + closure( + self.0 + .read() + .ok() + .ok_or_else(|| anyhow!("Registry has been poisoned"))? + .iter(), + ); + Ok(()) + } + pub fn remove(&self, index: usize) -> Result { + Ok(self + .0 + .write() + .ok() + .ok_or_else(|| anyhow!("Registry has been poisoned"))? + .remove(index)) + } +} + +impl Default for Registry { + fn default() -> Self { + Registry::(RwLock::new(Slab::new())) + } +}