use std::collections::HashMap;
use super::TypeScheme;
#[derive(Debug, PartialEq, Eq, Clone, Default, PartialOrd, Ord, Hash)]
pub struct Symbol {
pub module: String,
pub field: String,
}
#[derive(Debug, PartialEq, Eq, Clone, PartialOrd, Ord, Copy, Hash)]
pub struct ItemId(pub usize);
#[derive(Debug, Default, Clone)]
pub struct ItemSource {
pub types: HashMap<ItemId, TypeScheme>,
symbols: HashMap<Symbol, ItemId>,
next: usize,
}
impl ItemSource {
pub fn type_of_item(&self, item_id: ItemId) -> TypeScheme {
self.types[&item_id].clone()
}
pub fn register(&mut self, symbol: Symbol, type_scheme: TypeScheme) -> ItemId {
let item_id = ItemId(self.next);
self.next += 1;
self.symbols.insert(symbol.clone(), item_id);
self.types.insert(item_id, type_scheme);
item_id
}
pub fn resolve(&self, symbol: &Symbol) -> ItemId {
*self
.symbols
.get(symbol)
.unwrap_or_else(|| panic!("{symbol:?} should be defined"))
}
pub fn types(&self) -> &HashMap<ItemId, TypeScheme> {
&self.types
}
pub fn symbols(&self) -> &HashMap<Symbol, ItemId> {
&self.symbols
}
}