use std::collections::HashMap;
use crate::StepModel;
use crate::generated::model::EntityKey;
use crate::generated::walk::for_each_entity;
use crate::generated::write::Writer;
pub struct RefGraph {
referrers: HashMap<EntityKey, Vec<EntityKey>>,
}
impl StepModel {
#[must_use]
pub fn ref_graph(&self) -> RefGraph {
let writer = Writer::new(self);
let mut referrers: HashMap<EntityKey, Vec<EntityKey>> = HashMap::new();
let mut deps = Vec::new();
for_each_entity(self, |referrer| {
deps.clear();
writer.deps_of(referrer, &mut deps);
for &target in &deps {
referrers.entry(target).or_default().push(referrer);
}
});
RefGraph { referrers }
}
}
impl RefGraph {
#[must_use]
pub fn referrers(&self, target: EntityKey) -> &[EntityKey] {
self.referrers.get(&target).map_or(&[], Vec::as_slice)
}
}