use dsi_progress_logger::prelude::*;
use std::ops::ControlFlow::{Break, Continue};
use webgraph::traits::RandomAccessGraph;
use webgraph::{
visits::depth_first::{EventPred, SeqPath},
visits::{Sequential, StoppedWhenDone},
};
pub fn is_acyclic(graph: impl RandomAccessGraph, pl: &mut impl ProgressLog) -> bool {
let num_nodes = graph.num_nodes();
pl.item_name("node");
pl.expected_updates(Some(num_nodes));
pl.start("Checking acyclicity");
let mut visit = SeqPath::new(&graph);
let acyclic = visit.visit(0..num_nodes, |event| {
match event {
EventPred::Previsit { .. } => {
pl.light_update();
Continue(())
}
EventPred::Revisit { on_stack: true, .. } => Break(StoppedWhenDone {}),
_ => Continue(()),
}
});
pl.done();
acyclic.is_continue()
}