From 7fcaa5c13bf3f4a17b4f2f4e8098d062120a4f98 Mon Sep 17 00:00:00 2001 From: elvis Date: Sun, 27 Jul 2025 14:59:35 +0200 Subject: [PATCH] Removing Unnecessary structures for edge display in dot and graphml --- src/rsprocess/grammar.lalrpop | 88 +++++---------- src/rsprocess/graph.rs | 197 +++++++++++++--------------------- src/rsprocess/presets.rs | 77 ++++++------- 3 files changed, 140 insertions(+), 222 deletions(-) diff --git a/src/rsprocess/grammar.lalrpop b/src/rsprocess/grammar.lalrpop index f968cbf..ac10de6 100644 --- a/src/rsprocess/grammar.lalrpop +++ b/src/rsprocess/grammar.lalrpop @@ -266,11 +266,11 @@ LiteralSeparatorNode: graph::NodeDisplayBase = { }; /// Match for strings between edge formatters -LiteralSeparatorEdge: presets::EdgeDisplay = { +LiteralSeparatorEdge: graph::EdgeDisplayBase = { PATH => - presets::EdgeDisplay::Separator( - <>.trim_end_matches("\"").trim_start_matches("\"").to_string() - ) + graph::EdgeDisplayBase::String { + string: <>.trim_end_matches("\"").trim_start_matches("\"").to_string() + } }; NodeDisplayBase: graph::NodeDisplayBase = { @@ -317,80 +317,50 @@ SeparatorNode: graph::NodeDisplay = { } } -EdgeDisplay: presets::EdgeDisplay = { +EdgeDisplay: graph::EdgeDisplayBase = { "Hide" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::Hide - ), + graph::EdgeDisplayBase::Hide, "Products" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::Products - ), + graph::EdgeDisplayBase::Products, "MaskProducts" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::MaskEntities{ mask } - ), + graph::EdgeDisplayBase::MaskEntities{ mask }, "Entities" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::Entities - ), + graph::EdgeDisplayBase::Entities, "MaskEntities" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::MaskEntities{ mask } - ), + graph::EdgeDisplayBase::MaskEntities{ mask }, "Context" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::Context - ), + graph::EdgeDisplayBase::Context, "MaskContext" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::MaskContext{ mask } - ), + graph::EdgeDisplayBase::MaskContext{ mask }, "Union" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::Union - ), + graph::EdgeDisplayBase::Union, "MaskUnion" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::MaskUnion{ mask } - ), + graph::EdgeDisplayBase::MaskUnion{ mask }, "Difference" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::Difference - ), + graph::EdgeDisplayBase::Difference, "MaskDifference" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::MaskDifference{ mask } - ), + graph::EdgeDisplayBase::MaskDifference{ mask }, "EntitiesDeleted" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::EntitiesDeleted - ), + graph::EdgeDisplayBase::EntitiesDeleted, "MaskEntitiesDeleted" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::MaskEntitiesDeleted{ mask } - ), + graph::EdgeDisplayBase::MaskEntitiesDeleted{ mask }, "EntitiesAdded" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::EntitiesAdded - ), + graph::EdgeDisplayBase::EntitiesAdded, "MaskEntitiesAdded" => - presets::EdgeDisplay::Display( - graph::GraphMapEdges::MaskEntitiesAdded{ mask } - ), + graph::EdgeDisplayBase::MaskEntitiesAdded{ mask }, } /// Edge display formatters separated by arbitrary strings in quotes -SeparatorEdge: Vec = { - => vec![v], +SeparatorEdge: graph::EdgeDisplay = { + => graph::EdgeDisplay{ base: vec![v] }, )+> => match e { - None => v.iter().fold(vec![], - |mut acc, (a, b)| { - acc.push(a.clone()); - acc.push(b.clone()); - acc.clone() - }), + None => graph::EdgeDisplay{ base: v.iter().fold(vec![], + |mut acc, (a, b)| { + acc.push(a.clone()); + acc.push(b.clone()); + acc.clone() + }) }, Some(e) => { let mut v = v.iter().fold(vec![], |mut acc, (a, b)| { @@ -399,7 +369,7 @@ SeparatorEdge: Vec = { acc.clone() }); v.push(e); - v + graph::EdgeDisplay{ base: v } } } } diff --git a/src/rsprocess/graph.rs b/src/rsprocess/graph.rs index 33fc2cc..cdf5689 100644 --- a/src/rsprocess/graph.rs +++ b/src/rsprocess/graph.rs @@ -157,7 +157,7 @@ impl NodeDisplay { /// Helper structure that specifies what information to display for edges #[derive(Clone)] -pub enum GraphMapEdges { +pub enum EdgeDisplayBase { String { string: String }, Hide, Products, @@ -176,135 +176,92 @@ pub enum GraphMapEdges { MaskEntitiesAdded { mask: RSset }, } +pub struct EdgeDisplay { + pub base: Vec +} + type GraphMapEdgesFnTy<'a> = dyn Fn(petgraph::prelude::EdgeIndex, &'a RSlabel) -> String + 'a; -/// Helper structure that holds a formatting function from node as RSsystem to -/// string -pub struct GraphMapEdgesTy<'a> { - functions: Vec>>, + + +fn match_edge_display<'a>( + base: &'a EdgeDisplayBase, translator: Rc -} +) -> Box> { + use EdgeDisplayBase::*; + use super::format_helpers::graph_map_edges_ty_from::*; -impl<'a, const N: usize> From<([GraphMapEdges; N], Rc)> - for GraphMapEdgesTy<'a> -{ - fn from(value: ([GraphMapEdges; N], Rc)) -> Self { - Self::from((value.0.to_vec(), value.1)) + match base { + String { string } => { + format_string(translator, string.clone()) + } + Hide => { + format_hide(translator) + }, + Products => { + format_products(translator) + }, + MaskProducts { mask } => { + format_mask_products(translator, mask.clone()) + }, + Entities => { + format_entities(translator) + }, + MaskEntities { mask } => { + format_mask_entities(translator, mask.clone()) + }, + Context => { + format_context(translator) + }, + MaskContext { mask } => { + format_mask_context(translator, mask.clone()) + }, + Union => { + format_union(translator) + }, + MaskUnion { mask } => { + format_mask_union(translator, mask.clone()) + }, + Difference => { + format_difference(translator) + }, + MaskDifference { mask } => { + format_mask_difference(translator, mask.clone()) + }, + EntitiesDeleted => { + format_entities_deleted(translator) + }, + MaskEntitiesDeleted { mask } => { + format_mask_entities_deleted(translator, mask.clone()) + }, + EntitiesAdded => { + format_entities_added(translator) + }, + MaskEntitiesAdded { mask } => { + format_mask_entities_added(translator, mask.clone()) + }, } } -impl<'a> From<(&[GraphMapEdges], Rc)> - for GraphMapEdgesTy<'a> -{ - fn from(value: (&[GraphMapEdges], Rc)) -> Self { - Self::from((value.0.to_vec(), value.1)) - } -} -impl<'a> From<(Vec, Rc)> - for GraphMapEdgesTy<'a> -{ - fn from(value: (Vec, Rc)) -> Self { - use GraphMapEdges::*; - use super::format_helpers::graph_map_edges_ty_from::*; +impl EdgeDisplay { + pub fn generate<'a>( + self, + translator: Rc, + _current_graph: &RSgraph + ) -> Box> { + Box::new( + move |i, n| { + let mut accumulator = String::new(); + for b in &self.base { + let f = match_edge_display(b, + Rc::clone(&translator)); - let mut new = GraphMapEdgesTy {functions: vec![], translator: value.1}; - - for f in value.0 { - match f { - String { string } => { - new.functions.push(format_string( - Rc::clone(&new.translator), string)) + accumulator.push_str(&(f)(i, n)); } - Hide => { - new.functions.push(format_hide( - Rc::clone(&new.translator) - )) - }, - Products => { - new.functions.push(format_products( - Rc::clone(&new.translator) - )) - }, - MaskProducts { mask } => { - new.functions.push(format_mask_products( - Rc::clone(&new.translator), mask)) - }, - Entities => { - new.functions.push(format_entities( - Rc::clone(&new.translator) - )) - }, - MaskEntities { mask } => { - new.functions.push(format_mask_entities( - Rc::clone(&new.translator), mask)) - }, - Context => { - new.functions.push(format_context( - Rc::clone(&new.translator) - )) - }, - MaskContext { mask } => { - new.functions.push(format_mask_context( - Rc::clone(&new.translator), mask)) - }, - Union => { - new.functions.push(format_union( - Rc::clone(&new.translator) - )) - }, - MaskUnion { mask } => { - new.functions.push(format_mask_union( - Rc::clone(&new.translator), mask)) - }, - Difference => { - new.functions.push(format_difference( - Rc::clone(&new.translator) - )) - }, - MaskDifference { mask } => { - new.functions.push(format_mask_difference( - Rc::clone(&new.translator), mask)) - }, - EntitiesDeleted => { - new.functions.push(format_entities_deleted( - Rc::clone(&new.translator) - )) - }, - MaskEntitiesDeleted { mask } => { - new.functions.push(format_mask_entities_deleted( - Rc::clone(&new.translator), mask)) - }, - EntitiesAdded => { - new.functions.push(format_entities_added( - Rc::clone(&new.translator) - )) - }, - MaskEntitiesAdded { mask } => { - new.functions.push(format_mask_entities_added( - Rc::clone(&new.translator), mask)) - }, - }; - } - - new - } -} - -impl<'a> GraphMapEdgesTy<'a> { - pub fn generate(self) -> Box> { - let mut accumulator: Box> = - super::format_helpers::graph_map_edges_ty_from::format_hide( - Rc::clone(&self.translator) - ); - for f in self.functions { - accumulator = Box::new(move |i, n| { - (accumulator)(i, n) - + &f(i, n) - }) - } - - accumulator + accumulator + } + ) } } diff --git a/src/rsprocess/presets.rs b/src/rsprocess/presets.rs index 8c28f39..e4be0c0 100644 --- a/src/rsprocess/presets.rs +++ b/src/rsprocess/presets.rs @@ -13,7 +13,6 @@ use lalrpop_util::ParseError; // the code use crate::grammar; -use super::structure::RSlabel; use super::structure::{RSset, RSsystem}; use super::translator::Translator; use super::*; @@ -58,25 +57,18 @@ impl Default for SaveOptions { } } -// Describes display options for edges (RSlabels). -#[derive(Clone)] -pub enum EdgeDisplay { - Separator(String), - Display(graph::GraphMapEdges), -} - // Describes output options for a graph. pub enum GraphSaveOptions { Dot { node_display: graph::NodeDisplay, - edge_display: Vec, + edge_display: graph::EdgeDisplay, node_color: graph::NodeColor, edge_color: graph::EdgeColor, so: SaveOptions, }, GraphML { node_display: graph::NodeDisplay, - edge_display: Vec, + edge_display: graph::EdgeDisplay, so: SaveOptions, }, Serialize { @@ -554,41 +546,41 @@ pub fn bisimilar( // Output Functions // ----------------------------------------------------------------------------- -type GraphMapEdgesFnTy<'a> = - dyn Fn(petgraph::prelude::EdgeIndex, &'a RSlabel) -> String + 'a; -fn generate_edge_printing_fn<'a>( - edge_display: &[EdgeDisplay], - translator: Rc, -) -> Box> { - // The type cannot be aliased since rust doesnt like generics. - // We are iterating over the edge_display and constructing a function - // (accumulator) that prints out our formatted nodes. So at each step we - // call the previous function and add the next string or function. - let edge_display = edge_display.iter().map( - |e| { - match e { - EdgeDisplay::Display(d) => { - d.clone() - }, - EdgeDisplay::Separator(s) => { - graph::GraphMapEdges::String { string: s.clone() } - } - } - } - ).collect::>(); +// type GraphMapEdgesFnTy<'a> = +// dyn Fn(petgraph::prelude::EdgeIndex, &'a RSlabel) -> String + 'a; +// fn generate_edge_printing_fn<'a>( +// edge_display: graph::EdgeDisplay, +// translator: Rc, +// ) -> Box> { +// // The type cannot be aliased since rust doesnt like generics. +// // We are iterating over the edge_display and constructing a function +// // (accumulator) that prints out our formatted nodes. So at each step we +// // call the previous function and add the next string or function. +// let edge_display = edge_display.iter().map( +// |e| { +// match e { +// EdgeDisplay::Display(d) => { +// d.clone() +// }, +// EdgeDisplay::Separator(s) => { +// graph::EdgeDisplayBase::String { string: s.clone() } +// } +// } +// } +// ).collect::>(); - let gmet = graph::GraphMapEdgesTy::from( - (edge_display, Rc::clone(&translator)) - ); +// let gmet = graph::GraphMapEdgesTy::from( +// (edge_display, Rc::clone(&translator)) +// ); - gmet.generate() -} +// gmet.generate() +// } /// Writes the specified graph to a file in .dot format. pub fn dot( system: &EvaluatedSystem, node_display: graph::NodeDisplay, - edge_display: Vec, + edge_display: graph::EdgeDisplay, node_color: graph::NodeColor, edge_color: graph::EdgeColor ) -> Result { @@ -601,8 +593,7 @@ pub fn dot( let rc_translator = Rc::new(translator.clone()); let modified_graph = graph.map( node_display.generate(Rc::clone(&rc_translator), graph), - generate_edge_printing_fn(&edge_display, - Rc::clone(&rc_translator)), + edge_display.generate(Rc::clone(&rc_translator), graph), ); let graph = Rc::new(graph.to_owned()); @@ -629,7 +620,7 @@ pub fn dot( pub fn graphml( system: &EvaluatedSystem, node_display: graph::NodeDisplay, - edge_display: Vec, + edge_display: graph::EdgeDisplay, ) -> Result { match system { EvaluatedSystem::System { @@ -643,8 +634,8 @@ pub fn graphml( let modified_graph = graph.map( node_display.generate(Rc::clone(&rc_translator), graph), - generate_edge_printing_fn(&edge_display, - rc_translator), + edge_display.generate(rc_translator, + graph), ); use petgraph_graphml::GraphMl;