use std::collections::HashMap;
pub type Id = usize;
pub const NO_ID: Id = Id::MAX;
#[derive(Debug, Default, Clone)]
pub struct NameMap {
name_to_id: HashMap<String, Id>, id_to_name: HashMap<Id, String>, next_id: Id,
}
impl NameMap {
#[must_use]
pub fn name(&self, id: Id) -> &str {
self.id_to_name.get(&id).unwrap()
}
pub fn name_to_id(&mut self, name: &str) -> Id {
if let Some(id) = self.name_to_id.get(name) { *id } else { self.add_name(name) }
}
fn add_name(&mut self, name: &str) -> Id {
let id = self.next_id;
self.name_to_id.insert(name.to_string(), id);
self.id_to_name.insert(id, name.to_string());
self.next_id += 1;
id
}
}