use std::{cell::RefCell, collections::HashMap, mem};
use crate::segment::MPSegment;
pub struct Lexicon {
segments: RefCell<HashMap<u64, Box<MPSegment>>>,
}
impl Lexicon {
pub fn new() -> Self {
Lexicon {
segments: RefCell::new(HashMap::new()),
}
}
pub fn intern_with_name(
&self,
name: u64,
text: &str,
key: u64,
is_leaf: bool,
is_var: bool,
in_var_range: bool,
is_empty: bool,
unique: bool,
) -> &MPSegment {
let mut map = self.segments.borrow_mut();
if !map.contains_key(&key) {
let segment = MPSegment::new(
name,
text.to_string(),
is_leaf,
is_var,
in_var_range,
is_empty,
unique,
);
map.insert(key, Box::new(segment));
}
let interned = map.get(&key).unwrap();
unsafe { mem::transmute(interned.as_ref()) }
}
}