diff options
author | metamuffin <metamuffin@disroot.org> | 2025-10-06 13:43:04 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2025-10-06 13:43:04 +0200 |
commit | f4bce8374988cd0f18d21bf43c649bc4b34ccf74 (patch) | |
tree | d3e9255b08f601505ec197e0dc53bac1891c13d4 | |
parent | 821bacba156738d590a55505e03c8488c5db5db8 (diff) | |
download | hurrycurry-f4bce8374988cd0f18d21bf43c649bc4b34ccf74.tar hurrycurry-f4bce8374988cd0f18d21bf43c649bc4b34ccf74.tar.bz2 hurrycurry-f4bce8374988cd0f18d21bf43c649bc4b34ccf74.tar.zst |
Clean up orphan nodes
-rw-r--r-- | server/tools/src/recipe_diagram.rs | 22 |
1 files changed, 21 insertions, 1 deletions
diff --git a/server/tools/src/recipe_diagram.rs b/server/tools/src/recipe_diagram.rs index 8e9c14b6..ec7656b9 100644 --- a/server/tools/src/recipe_diagram.rs +++ b/server/tools/src/recipe_diagram.rs @@ -98,7 +98,7 @@ pub(crate) fn recipe_diagram( let index = diag.nodes.len(); let recipe = data.recipe(r.index); - if matches!(recipe, Recipe::Instant { .. }) && r.outputs.len() == 1 { + if matches!(recipe, Recipe::Instant { .. }) && r.outputs.len() == 1 && r.inputs.len() >= 1 { for i in r.inputs { diag.edges.push(DiagramEdge { src: item_index[&i], @@ -141,6 +141,7 @@ pub(crate) fn recipe_diagram( } merge_combine_clusters(&mut diag); + remove_orphan_nodes(&mut diag); Ok(diag) } @@ -205,3 +206,22 @@ fn merge_combine_clusters(diag: &mut Diagram) { } } } + +fn remove_orphan_nodes(diag: &mut Diagram) { + let mut to_remove = diag + .nodes + .iter() + .enumerate() + .filter(|&(i, _)| !diag.edges.iter().any(|e| e.src == i || e.dst == i)) + .map(|(i, _)| i) + .collect::<Vec<_>>(); + to_remove.sort_by_key(|x| Reverse(*x)); + + for e in &mut diag.edges { + e.src -= to_remove.iter().filter(|&&i| i < e.src).count(); + e.dst -= to_remove.iter().filter(|&&i| i < e.dst).count(); + } + for i in to_remove { + diag.nodes.remove(i); + } +} |