use std::collections::{BTreeMap, BTreeSet};
use crate::value_objects::{CeremonyComposition, SystemCeremonyId};
pub(super) fn blocking(
ceremonies: &BTreeMap<SystemCeremonyId, CeremonyComposition>,
) -> BTreeMap<SystemCeremonyId, Vec<SystemCeremonyId>> {
let back = back_edges(ceremonies);
ceremonies
.iter()
.map(|(id, composition)| {
let waits = composition
.depends_on()
.iter()
.filter(|dependency| !back.contains(&(id.clone(), (*dependency).clone())))
.cloned()
.collect();
(id.clone(), waits)
})
.collect()
}
fn back_edges(
ceremonies: &BTreeMap<SystemCeremonyId, CeremonyComposition>,
) -> BTreeSet<(SystemCeremonyId, SystemCeremonyId)> {
ceremonies
.iter()
.filter_map(|(id, composition)| {
composition
.activation()
.loops_after()
.map(|anchor| (anchor.clone(), id.clone()))
})
.collect()
}