use crate::internal::node::Node;
use crate::internal::scc::Scc;
pub struct SccDecomposition {
pub(super) nodes_to_sccs: Vec<usize>,
pub(super) sccs: Vec<Scc>,
}
impl SccDecomposition {
pub fn len(&self) -> usize {
self.sccs.len()
}
pub fn is_empty(&self) -> bool {
self.sccs.is_empty()
}
pub fn scc_of_node(&self, node: Node) -> &Scc {
assert!(node.id < self.nodes_to_sccs.len());
let scc_id = self.nodes_to_sccs[node.id];
assert!(scc_id < self.sccs.len());
&self.sccs[scc_id]
}
pub fn iter_sccs(&self) -> impl Iterator<Item = &Scc> {
self.sccs.iter()
}
pub fn iter_nodes(&self) -> impl Iterator<Item = Node> + '_ {
self.sccs.iter().flat_map(|sccs| sccs.iter_nodes())
}
}