use vize_l0::Span;
use super::{BindingId, BindingOrigin, EffectSet, EscapeKind, ReactivityClass};
pub use vize_l0::diag::Verdict;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct BindingInput {
pub id: BindingId,
pub origin: BindingOrigin,
pub effects: EffectSet,
pub escape: EscapeKind,
pub verdict: Verdict,
pub span: Span,
}
impl BindingInput {
#[must_use]
pub const fn local(id: BindingId, span: Span) -> Self {
Self {
id,
origin: BindingOrigin::Local,
effects: EffectSet::empty(),
escape: EscapeKind::None,
verdict: Verdict::Proven,
span,
}
}
#[must_use]
pub const fn with_origin(mut self, origin: BindingOrigin) -> Self {
self.origin = origin;
self
}
#[must_use]
pub const fn with_effects(mut self, effects: EffectSet) -> Self {
self.effects = effects;
self
}
#[must_use]
pub const fn with_escape(mut self, escape: EscapeKind) -> Self {
self.escape = escape;
self
}
#[must_use]
pub const fn with_verdict(mut self, verdict: Verdict) -> Self {
self.verdict = verdict;
self
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct BindingFact {
pub id: BindingId,
pub class: ReactivityClass,
pub verdict: Verdict,
pub origin: BindingOrigin,
pub effects: EffectSet,
pub escape: EscapeKind,
pub span: Span,
}
impl BindingFact {
#[must_use]
pub const fn proven_class(self) -> Option<ReactivityClass> {
if self.verdict.is_proven() {
Some(self.class)
} else {
None
}
}
#[must_use]
pub const fn fires_as(self, class: ReactivityClass) -> bool {
self.verdict.is_proven() && self.class as u8 == class as u8
}
}