use vize_l0::{Allocator, Vec};
use super::axis::classify;
use super::{BindingFact, BindingId, BindingInput};
#[derive(Debug)]
pub struct LatticeFacts<'a> {
pub bindings: Vec<'a, BindingFact>,
}
impl<'a> LatticeFacts<'a> {
#[must_use]
pub fn new(allocator: &'a Allocator) -> Self {
Self {
bindings: Vec::new_in(&allocator),
}
}
pub fn push(&mut self, fact: BindingFact) {
self.bindings.push(fact);
}
#[must_use]
pub fn get(&self, id: BindingId) -> Option<&BindingFact> {
self.bindings.iter().find(|fact| fact.id == id)
}
}
#[must_use]
pub fn evaluate<'a>(
allocator: &'a Allocator,
inputs: impl IntoIterator<Item = BindingInput>,
) -> LatticeFacts<'a> {
let mut facts = LatticeFacts::new(allocator);
for input in inputs {
facts.push(evaluate_binding(input));
}
facts
}
#[must_use]
pub const fn evaluate_binding(input: BindingInput) -> BindingFact {
BindingFact {
id: input.id,
class: classify(input.origin, input.effects, input.escape),
verdict: input.verdict,
origin: input.origin,
effects: input.effects,
escape: input.escape,
span: input.span,
}
}