use std::sync::Arc; pub type AStrMap = Vec<(Arc, V)>; pub trait AStrMapExt { fn arc_set(&mut self, key: Arc, value: V) -> bool; fn arc_get(&self, key: &str) -> Option<&V>; fn arc_rm(&mut self, key: &str) -> Option; } impl AStrMapExt for AStrMap { fn arc_set(&mut self, key: Arc, value: V) -> bool { let index = self.iter().position(|(k, _)| k.as_ref().eq(key.as_ref())); index.map(|i| self.remove(i).1); self.push((key, value)); true } fn arc_get(&self, key: &str) -> Option<&V> { self .iter() .find_map(|(k, v)| if k.as_ref().eq(key) { Some(v) } else { None }) } fn arc_rm(&mut self, key: &str) -> Option { let index = self.iter().position(|(k, _)| k.as_ref().eq(key)); index.map(|i| self.remove(i).1) } } pub type AStrSet = Vec>; pub trait AStrSetExt { fn arc_set(&mut self, value: Arc) -> bool; fn arc_get(&self, value: &str) -> bool; fn arc_rm(&mut self, value: &str) -> bool; } impl AStrSetExt for AStrSet { fn arc_set(&mut self, value: Arc) -> bool { if self.iter().any(|v| v.as_ref().eq(value.as_ref())) { return false; } self.push(value); true } fn arc_get(&self, value: &str) -> bool { self.iter().any(|v| v.as_ref().eq(value)) } fn arc_rm(&mut self, value: &str) -> bool { let index = self.iter().position(|v| v.as_ref().eq(value)); index.is_some_and(|i| { self.remove(i); true }) } }