diff --git a/brood/src/algo/edit.rs b/brood/src/algo/edit.rs index 2b44298..2be0c0a 100644 --- a/brood/src/algo/edit.rs +++ b/brood/src/algo/edit.rs @@ -72,3 +72,26 @@ pub fn resolve_redirects(data: &mut Data) { } } } + +pub fn invert(data: &mut Data) { + let links = mem::take(&mut data.links); + let graph = mem::take(&mut data.graph); + + let mut edges = graph + .edges() + .zip(links) + .map(|((source, target), link)| (source, target, link)) + .collect::>(); + + edges.sort_by_key(|(_, target, _)| *target); + + let mut edges = edges.into_iter().peekable(); + for node in graph.nodes() { + data.graph.add_node(); + while edges.peek().is_some_and(|(_, target, _)| *target <= node) { + let (source, _, link) = edges.next().unwrap(); + data.graph.add_edge(source); + data.links.push(link); + } + } +} diff --git a/brood/src/main.rs b/brood/src/main.rs index f0e1a30..757695b 100644 --- a/brood/src/main.rs +++ b/brood/src/main.rs @@ -28,6 +28,10 @@ struct Args { in_structure: Option, #[arg(long, short = 'R')] resolve_redirects: bool, + #[arg(long, short = 'I')] + invert_edges: bool, + #[arg(long, short)] + check_consistency: bool, } fn main() -> io::Result<()> { @@ -38,6 +42,7 @@ fn main() -> io::Result<()> { } println!(">> Import"); + println!("> Reading data"); let mut data = Data::read_from_file(&args.datafile)?; if args.in_parens.is_some() || args.in_structure.is_some() { @@ -53,6 +58,16 @@ fn main() -> io::Result<()> { algo::resolve_redirects(&mut data); } + if args.invert_edges { + println!("> Inverting edges"); + algo::invert(&mut data); + } + + if args.check_consistency { + println!("> Checking consistencey"); + data.check_consistency(); + } + match args.command { Command::Ingest(_) => unreachable!(), Command::Export(cmd) => cmd.run(data),