use { crate::{ CritMatcherId, crit_graph::{CritTarget, crit_upstream::CritUpstreamNode}, }, std::rc::Rc, }; pub struct CritDownstreamData where Target: CritTarget, { id: CritMatcherId, pub(super) upstream: Vec>>, } pub trait CritDownstream: 'static { fn update_matched(self: Rc, target: &Target, matched: bool); } impl CritDownstreamData where Target: CritTarget, { pub fn new(id: CritMatcherId, upstream: &[Rc>]) -> Self { Self { id, upstream: upstream.to_vec(), } } pub fn attach(&self, slf: &Rc>) { for upstream in &self.upstream { upstream.attach(self.id, slf.clone() as _); } } pub fn not(&self, mgr: &Target::Mgr) -> Vec>> { self.upstream.iter().map(|n| n.not(mgr)).collect() } } impl Drop for CritDownstreamData where Target: CritTarget, { fn drop(&mut self) { for el in &self.upstream { el.detach(self.id); } } }