mirror of
https://codeberg.org/unspeaker/tek.git
synced 2026-07-17 07:46:57 +02:00
27 lines
860 B
Rust
27 lines
860 B
Rust
use crate::*;
|
|
|
|
/// Collection of UI modes.
|
|
#[derive(Default, Debug, Clone)]
|
|
pub struct Modes(
|
|
Arc<RwLock<BTreeMap<Arc<str>, Arc<Mode<Arc<str>>>>>>
|
|
);
|
|
|
|
impl Modes {
|
|
pub fn add (&self, name: &impl AsRef<str>, body: &impl Language) -> Usually<()> {
|
|
let mut mode = Mode::default();
|
|
body.each(|item|mode.add(item))?;
|
|
self.0.write().unwrap().insert(name.as_ref().into(), Arc::new(mode));
|
|
Ok(())
|
|
}
|
|
pub fn get (&self, name: impl AsRef<str>) -> Option<Arc<Mode<Arc<str>>>> {
|
|
self.0.read().unwrap().get(name.as_ref()).cloned()
|
|
}
|
|
pub fn for_each <T> (&self, mut ator: impl FnMut(&str, &Mode<Arc<str>>)->T) {
|
|
for (k, v) in self.0.read().unwrap().iter() {
|
|
let _ = ator(k.as_ref(), v.as_ref());
|
|
}
|
|
}
|
|
pub fn len (&self) -> usize {
|
|
self.0.read().unwrap().len()
|
|
}
|
|
}
|