use parking_lot::RwLock;
use std::collections::HashMap;
pub struct Inner {
id: u64,
forward: HashMap<String, u64>,
backward: HashMap<u64, String>,
}
impl Inner {
pub fn new() -> Self {
Inner {
id: 1,
forward: HashMap::new(),
backward: HashMap::new(),
}
}
}
pub struct Scopes {
inner: RwLock<Inner>,
}
impl Scopes {
pub fn new() -> Self {
Scopes {
inner: RwLock::new(Inner::new()),
}
}
pub fn register(&self, scope: String) -> u64 {
let mut wg = self.inner.write();
if wg.forward.contains_key(&scope) {
return wg.forward.get(&scope).cloned().unwrap();
}
let scope_id = wg.id;
let _ = wg.forward.insert(scope.clone(), scope_id);
let _ = wg.backward.insert(scope_id, scope);
wg.id += 1;
scope_id
}
pub fn get(&self, scope_id: u64) -> Option<String> {
let rg = self.inner.read();
rg.backward.get(&scope_id).cloned()
}
}