use crate::checker::types::TypeId;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct ValueId(usize);
impl ValueId {
pub fn as_usize(&self) -> usize {
self.0
}
pub fn init() -> Self {
Self(0)
}
pub fn next_id(&mut self) -> Self {
let id = self.0;
self.0 += 1;
Self(id)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub struct Value {
pub id: ValueId,
pub type_id: TypeId,
pub is_scoped: bool,
pub is_mut: bool,
}
impl Value {
pub fn new(id: ValueId, type_id: TypeId, is_mut: bool, is_scoped: bool) -> Self {
Self { id, type_id, is_mut, is_scoped }
}
pub fn new_mutable(id: ValueId, type_id: TypeId, is_scoped: bool) -> Self {
Self { id, type_id, is_mut: true, is_scoped }
}
pub fn new_immutable(id: ValueId, type_id: TypeId, is_scoped: bool) -> Self {
Self { id, type_id, is_mut: false, is_scoped }
}
pub fn new_scoped(id: ValueId, type_id: TypeId, is_mut: bool) -> Self {
Self { id, type_id, is_mut, is_scoped: true }
}
pub fn new_external(id: ValueId, type_id: TypeId, is_mut: bool) -> Self {
Self { id, type_id, is_mut, is_scoped: false }
}
pub fn get_type_id(&self) -> TypeId {
self.type_id
}
pub fn is_mutable(&self) -> bool {
self.is_mut
}
pub fn is_scoped(&self) -> bool {
self.is_scoped
}
}