use dsi_progress_logger::ProgressLog;
use no_break::NoBreak;
use std::ops::ControlFlow::Continue;
use webgraph::traits::RandomAccessGraph;
use webgraph::{
visits::depth_first::SeqPred,
visits::{Sequential, depth_first::*},
};
pub fn top_sort(graph: impl RandomAccessGraph, pl: &mut impl ProgressLog) -> Box<[usize]> {
let num_nodes = graph.num_nodes();
pl.item_name("node");
pl.expected_updates(Some(num_nodes));
pl.start("Computing topological sort");
let mut visit = SeqPred::new(&graph);
let mut top_sort = Box::new_uninit_slice(num_nodes);
let mut pos = num_nodes;
visit
.visit(0..num_nodes, |event| {
match event {
EventPred::Previsit { .. } => {
pl.light_update();
}
EventPred::Postvisit { node, .. } => {
pos -= 1;
top_sort[pos].write(node);
}
_ => (),
}
Continue(())
})
.continue_value_no_break();
pl.done();
unsafe { top_sort.assume_init() }
}