use alloc::{sync::Arc, vec::Vec};
use midenc_hir_type::FunctionType;
use super::LibraryPath;
use crate::{
Word,
ast::{AttributeSet, ProcedureIndex, ProcedureName},
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ModuleInfo {
path: LibraryPath,
procedures: Vec<ProcedureInfo>,
}
impl ModuleInfo {
pub fn new(path: LibraryPath) -> Self {
Self { path, procedures: Vec::new() }
}
pub fn add_procedure(
&mut self,
name: ProcedureName,
digest: Word,
signature: Option<Arc<FunctionType>>,
attributes: AttributeSet,
) {
self.procedures.push(ProcedureInfo { name, digest, signature, attributes });
}
pub fn path(&self) -> &LibraryPath {
&self.path
}
pub fn num_procedures(&self) -> usize {
self.procedures.len()
}
pub fn get_procedure_by_index(&self, index: ProcedureIndex) -> Option<&ProcedureInfo> {
self.procedures.get(index.as_usize())
}
pub fn get_procedure_digest_by_name(&self, name: &ProcedureName) -> Option<Word> {
self.procedures.iter().find_map(|proc_info| {
if &proc_info.name == name {
Some(proc_info.digest)
} else {
None
}
})
}
pub fn procedures(&self) -> impl Iterator<Item = (ProcedureIndex, &ProcedureInfo)> {
self.procedures
.iter()
.enumerate()
.map(|(idx, proc)| (ProcedureIndex::new(idx), proc))
}
pub fn procedure_digests(&self) -> impl Iterator<Item = Word> + '_ {
self.procedures.iter().map(|p| p.digest)
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ProcedureInfo {
pub name: ProcedureName,
pub digest: Word,
pub signature: Option<Arc<FunctionType>>,
pub attributes: AttributeSet,
}