use crate::internal::node::Node;
use crate::internal::scc_decomposition::SccDecomposition;
use crate::internal::tarjan_algorithm::TarjanAlgorithm;
#[derive(Clone, Default)]
pub struct Graph {
pub(super) edges: Vec<Vec<usize>>,
}
impl Graph {
pub fn new() -> Self {
Self { edges: Vec::new() }
}
pub fn new_node(&mut self) -> Node {
let node = Node {
id: self.edges.len(),
};
self.edges.push(Vec::new());
node
}
pub fn new_edge(&mut self, from: Node, to: Node) {
assert!(from.id < self.edges.len());
assert!(to.id < self.edges.len());
self.edges[from.id].push(to.id);
}
pub fn find_sccs(&self) -> SccDecomposition {
TarjanAlgorithm::new(self).solve()
}
pub fn len(&self) -> usize {
self.edges.len()
}
pub fn is_empty(&self) -> bool {
self.edges.is_empty()
}
pub fn iter_nodes(&self) -> impl Iterator<Item = Node> {
(0..self.edges.len()).map(|id| Node { id })
}
pub fn iter_successors(&self, node: Node) -> impl Iterator<Item = Node> {
assert!(node.id < self.edges.len());
self.edges[node.id].iter().copied().map(|id| Node { id })
}
}