use crate::*; /// Collection of UI modes. #[derive(Default, Debug, Clone)] pub struct Modes( Arc, Arc>>>>> ); impl Modes { pub fn add (&self, name: &impl AsRef, 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) -> Option>>> { self.0.read().unwrap().get(name.as_ref()).cloned() } pub fn for_each (&self, mut ator: impl FnMut(&str, &Mode>)->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() } }