use crate::lang::FunctionId;
use crate::lang::functions::{Function, FunctionKind};
use std::collections::HashMap;
#[derive(Default)]
pub struct Config {}
#[derive(Debug)]
pub struct Pass {
functions: HashMap<FunctionId, Function>,
}
impl Pass {
#[must_use]
pub fn new(_: Config) -> Self {
Self { functions: HashMap::default() }
}
pub fn register(&mut self, id: FunctionId, function: Function) {
self.functions.insert(id, function);
}
#[must_use]
pub fn get(&self, id: FunctionId) -> Option<&Function> {
self.functions.get(&id)
}
pub fn iter(&self) -> impl Iterator<Item = (&FunctionId, &Function)> {
self.functions.iter()
}
pub fn originals(&self) -> impl Iterator<Item = (&FunctionId, &Function)> {
self.functions.iter().filter(|(_, f)| matches!(f.kind, FunctionKind::Original))
}
pub fn overloads(&self) -> impl Iterator<Item = (&FunctionId, &Function)> {
self.functions.iter().filter(|(_, f)| matches!(f.kind, FunctionKind::Overload(_)))
}
pub fn overloads_for(&self, original_id: FunctionId) -> impl Iterator<Item = (&FunctionId, &Function)> {
self.functions.iter().filter(move |(_, f)| match &f.kind {
FunctionKind::Overload(o) => o.base == original_id,
FunctionKind::Original => false,
})
}
}