use std::collections::HashMap;
use crate::value::Value;
pub(crate) type ValueId = u32;
#[derive(Debug, Default)]
pub(crate) struct ValuePool {
values: Vec<Value>,
index: HashMap<Value, ValueId>,
}
impl ValuePool {
pub(crate) fn new() -> Self {
Self::default()
}
pub(crate) fn intern(&mut self, value: Value) -> ValueId {
if let Some(&id) = self.index.get(&value) {
return id;
}
let id = ValueId::try_from(self.values.len()).expect("value pool exceeded u32::MAX ids");
self.values.push(value.clone());
self.index.insert(value, id);
id
}
pub(crate) fn get(&self, id: ValueId) -> &Value {
&self.values[id as usize]
}
}