vize_l3 0.430.1

L3 - the Davinci reactivity IR (codename Impeto): flat scheduled ops with explicit state and effect edges
Documentation
//! Private policies specialize the existing complete occurrence check.

use super::VueReadKind;
use vize_l2::{
    file::{BindingRef, vue::VueExposure},
    resolution::{Occurrence, Usage},
};

pub(in crate::decision) trait FileReads<'owner, 'arena> {
    const RECORD: bool;
    fn classify(
        &self,
        occurrence: &Occurrence<'arena>,
        binding: BindingRef<'owner, 'arena>,
    ) -> Option<VueReadKind>;
}

pub(in crate::decision) struct NoReads;

impl<'owner, 'arena> FileReads<'owner, 'arena> for NoReads {
    const RECORD: bool = false;
    fn classify(
        &self,
        _: &Occurrence<'arena>,
        _: BindingRef<'owner, 'arena>,
    ) -> Option<VueReadKind> {
        None
    }
}

pub(super) struct ExposureReads<'view, 'owner, 'descriptor, 'program, 'arena>(
    pub(super) &'view VueExposure<'owner, 'descriptor, 'program, 'arena>,
);

impl<'owner, 'arena> FileReads<'owner, 'arena> for ExposureReads<'_, 'owner, '_, '_, 'arena> {
    const RECORD: bool = true;
    fn classify(
        &self,
        occurrence: &Occurrence<'arena>,
        binding: BindingRef<'owner, 'arena>,
    ) -> Option<VueReadKind> {
        (occurrence.usage == Usage::Read && self.0.binding(binding).is_ok())
            .then_some(VueReadKind::SetupLet)
    }
}