Removing Unnecessary structures for edge display in dot and graphml
This commit is contained in:
@ -266,11 +266,11 @@ LiteralSeparatorNode: graph::NodeDisplayBase = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
/// Match for strings between edge formatters
|
/// Match for strings between edge formatters
|
||||||
LiteralSeparatorEdge: presets::EdgeDisplay = {
|
LiteralSeparatorEdge: graph::EdgeDisplayBase = {
|
||||||
PATH =>
|
PATH =>
|
||||||
presets::EdgeDisplay::Separator(
|
graph::EdgeDisplayBase::String {
|
||||||
<>.trim_end_matches("\"").trim_start_matches("\"").to_string()
|
string: <>.trim_end_matches("\"").trim_start_matches("\"").to_string()
|
||||||
)
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
NodeDisplayBase: graph::NodeDisplayBase = {
|
NodeDisplayBase: graph::NodeDisplayBase = {
|
||||||
@ -317,80 +317,50 @@ SeparatorNode: graph::NodeDisplay = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
EdgeDisplay: presets::EdgeDisplay = {
|
EdgeDisplay: graph::EdgeDisplayBase = {
|
||||||
"Hide" =>
|
"Hide" =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::Hide,
|
||||||
graph::GraphMapEdges::Hide
|
|
||||||
),
|
|
||||||
"Products" =>
|
"Products" =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::Products,
|
||||||
graph::GraphMapEdges::Products
|
|
||||||
),
|
|
||||||
"MaskProducts" <mask: Set> =>
|
"MaskProducts" <mask: Set> =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::MaskEntities{ mask },
|
||||||
graph::GraphMapEdges::MaskEntities{ mask }
|
|
||||||
),
|
|
||||||
"Entities" =>
|
"Entities" =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::Entities,
|
||||||
graph::GraphMapEdges::Entities
|
|
||||||
),
|
|
||||||
"MaskEntities" <mask: Set> =>
|
"MaskEntities" <mask: Set> =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::MaskEntities{ mask },
|
||||||
graph::GraphMapEdges::MaskEntities{ mask }
|
|
||||||
),
|
|
||||||
"Context" =>
|
"Context" =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::Context,
|
||||||
graph::GraphMapEdges::Context
|
|
||||||
),
|
|
||||||
"MaskContext" <mask: Set> =>
|
"MaskContext" <mask: Set> =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::MaskContext{ mask },
|
||||||
graph::GraphMapEdges::MaskContext{ mask }
|
|
||||||
),
|
|
||||||
"Union" =>
|
"Union" =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::Union,
|
||||||
graph::GraphMapEdges::Union
|
|
||||||
),
|
|
||||||
"MaskUnion" <mask: Set> =>
|
"MaskUnion" <mask: Set> =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::MaskUnion{ mask },
|
||||||
graph::GraphMapEdges::MaskUnion{ mask }
|
|
||||||
),
|
|
||||||
"Difference" =>
|
"Difference" =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::Difference,
|
||||||
graph::GraphMapEdges::Difference
|
|
||||||
),
|
|
||||||
"MaskDifference" <mask: Set> =>
|
"MaskDifference" <mask: Set> =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::MaskDifference{ mask },
|
||||||
graph::GraphMapEdges::MaskDifference{ mask }
|
|
||||||
),
|
|
||||||
"EntitiesDeleted" =>
|
"EntitiesDeleted" =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::EntitiesDeleted,
|
||||||
graph::GraphMapEdges::EntitiesDeleted
|
|
||||||
),
|
|
||||||
"MaskEntitiesDeleted" <mask: Set> =>
|
"MaskEntitiesDeleted" <mask: Set> =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::MaskEntitiesDeleted{ mask },
|
||||||
graph::GraphMapEdges::MaskEntitiesDeleted{ mask }
|
|
||||||
),
|
|
||||||
"EntitiesAdded" =>
|
"EntitiesAdded" =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::EntitiesAdded,
|
||||||
graph::GraphMapEdges::EntitiesAdded
|
|
||||||
),
|
|
||||||
"MaskEntitiesAdded" <mask: Set> =>
|
"MaskEntitiesAdded" <mask: Set> =>
|
||||||
presets::EdgeDisplay::Display(
|
graph::EdgeDisplayBase::MaskEntitiesAdded{ mask },
|
||||||
graph::GraphMapEdges::MaskEntitiesAdded{ mask }
|
|
||||||
),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Edge display formatters separated by arbitrary strings in quotes
|
/// Edge display formatters separated by arbitrary strings in quotes
|
||||||
SeparatorEdge: Vec<presets::EdgeDisplay> = {
|
SeparatorEdge: graph::EdgeDisplay = {
|
||||||
<v: EdgeDisplay> => vec![v],
|
<v: EdgeDisplay> => graph::EdgeDisplay{ base: vec![v] },
|
||||||
<v:(<EdgeDisplay> <LiteralSeparatorEdge>)+> <e: EdgeDisplay?> =>
|
<v:(<EdgeDisplay> <LiteralSeparatorEdge>)+> <e: EdgeDisplay?> =>
|
||||||
match e {
|
match e {
|
||||||
None => v.iter().fold(vec![],
|
None => graph::EdgeDisplay{ base: v.iter().fold(vec![],
|
||||||
|mut acc, (a, b)| {
|
|mut acc, (a, b)| {
|
||||||
acc.push(a.clone());
|
acc.push(a.clone());
|
||||||
acc.push(b.clone());
|
acc.push(b.clone());
|
||||||
acc.clone()
|
acc.clone()
|
||||||
}),
|
}) },
|
||||||
Some(e) => {
|
Some(e) => {
|
||||||
let mut v = v.iter().fold(vec![],
|
let mut v = v.iter().fold(vec![],
|
||||||
|mut acc, (a, b)| {
|
|mut acc, (a, b)| {
|
||||||
@ -399,7 +369,7 @@ SeparatorEdge: Vec<presets::EdgeDisplay> = {
|
|||||||
acc.clone()
|
acc.clone()
|
||||||
});
|
});
|
||||||
v.push(e);
|
v.push(e);
|
||||||
v
|
graph::EdgeDisplay{ base: v }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -157,7 +157,7 @@ impl NodeDisplay {
|
|||||||
|
|
||||||
/// Helper structure that specifies what information to display for edges
|
/// Helper structure that specifies what information to display for edges
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
pub enum GraphMapEdges {
|
pub enum EdgeDisplayBase {
|
||||||
String { string: String },
|
String { string: String },
|
||||||
Hide,
|
Hide,
|
||||||
Products,
|
Products,
|
||||||
@ -176,135 +176,92 @@ pub enum GraphMapEdges {
|
|||||||
MaskEntitiesAdded { mask: RSset },
|
MaskEntitiesAdded { mask: RSset },
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct EdgeDisplay {
|
||||||
|
pub base: Vec<EdgeDisplayBase>
|
||||||
|
}
|
||||||
|
|
||||||
type GraphMapEdgesFnTy<'a> =
|
type GraphMapEdgesFnTy<'a> =
|
||||||
dyn Fn(petgraph::prelude::EdgeIndex, &'a RSlabel) -> String + '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> {
|
fn match_edge_display<'a>(
|
||||||
functions: Vec<Box<GraphMapEdgesFnTy<'a>>>,
|
base: &'a EdgeDisplayBase,
|
||||||
translator: Rc<translator::Translator>
|
translator: Rc<translator::Translator>
|
||||||
}
|
) -> Box<GraphMapEdgesFnTy<'a>> {
|
||||||
|
use EdgeDisplayBase::*;
|
||||||
|
use super::format_helpers::graph_map_edges_ty_from::*;
|
||||||
|
|
||||||
impl<'a, const N: usize> From<([GraphMapEdges; N], Rc<translator::Translator>)>
|
match base {
|
||||||
for GraphMapEdgesTy<'a>
|
String { string } => {
|
||||||
{
|
format_string(translator, string.clone())
|
||||||
fn from(value: ([GraphMapEdges; N], Rc<translator::Translator>)) -> Self {
|
}
|
||||||
Self::from((value.0.to_vec(), value.1))
|
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<translator::Translator>)>
|
|
||||||
for GraphMapEdgesTy<'a>
|
|
||||||
{
|
|
||||||
fn from(value: (&[GraphMapEdges], Rc<translator::Translator>)) -> Self {
|
|
||||||
Self::from((value.0.to_vec(), value.1))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a> From<(Vec<GraphMapEdges>, Rc<translator::Translator>)>
|
impl EdgeDisplay {
|
||||||
for GraphMapEdgesTy<'a>
|
pub fn generate<'a>(
|
||||||
{
|
self,
|
||||||
fn from(value: (Vec<GraphMapEdges>, Rc<translator::Translator>)) -> Self {
|
translator: Rc<translator::Translator>,
|
||||||
use GraphMapEdges::*;
|
_current_graph: &RSgraph
|
||||||
use super::format_helpers::graph_map_edges_ty_from::*;
|
) -> Box<GraphMapEdgesFnTy<'a>> {
|
||||||
|
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};
|
accumulator.push_str(&(f)(i, n));
|
||||||
|
|
||||||
for f in value.0 {
|
|
||||||
match f {
|
|
||||||
String { string } => {
|
|
||||||
new.functions.push(format_string(
|
|
||||||
Rc::clone(&new.translator), string))
|
|
||||||
}
|
}
|
||||||
Hide => {
|
accumulator
|
||||||
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<GraphMapEdgesFnTy<'a>> {
|
|
||||||
let mut accumulator: Box<GraphMapEdgesFnTy<'a>> =
|
|
||||||
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
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -13,7 +13,6 @@ use lalrpop_util::ParseError;
|
|||||||
// the code
|
// the code
|
||||||
use crate::grammar;
|
use crate::grammar;
|
||||||
|
|
||||||
use super::structure::RSlabel;
|
|
||||||
use super::structure::{RSset, RSsystem};
|
use super::structure::{RSset, RSsystem};
|
||||||
use super::translator::Translator;
|
use super::translator::Translator;
|
||||||
use super::*;
|
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.
|
// Describes output options for a graph.
|
||||||
pub enum GraphSaveOptions {
|
pub enum GraphSaveOptions {
|
||||||
Dot {
|
Dot {
|
||||||
node_display: graph::NodeDisplay,
|
node_display: graph::NodeDisplay,
|
||||||
edge_display: Vec<EdgeDisplay>,
|
edge_display: graph::EdgeDisplay,
|
||||||
node_color: graph::NodeColor,
|
node_color: graph::NodeColor,
|
||||||
edge_color: graph::EdgeColor,
|
edge_color: graph::EdgeColor,
|
||||||
so: SaveOptions,
|
so: SaveOptions,
|
||||||
},
|
},
|
||||||
GraphML {
|
GraphML {
|
||||||
node_display: graph::NodeDisplay,
|
node_display: graph::NodeDisplay,
|
||||||
edge_display: Vec<EdgeDisplay>,
|
edge_display: graph::EdgeDisplay,
|
||||||
so: SaveOptions,
|
so: SaveOptions,
|
||||||
},
|
},
|
||||||
Serialize {
|
Serialize {
|
||||||
@ -554,41 +546,41 @@ pub fn bisimilar(
|
|||||||
// Output Functions
|
// Output Functions
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
|
||||||
type GraphMapEdgesFnTy<'a> =
|
// type GraphMapEdgesFnTy<'a> =
|
||||||
dyn Fn(petgraph::prelude::EdgeIndex, &'a RSlabel) -> String + 'a;
|
// dyn Fn(petgraph::prelude::EdgeIndex, &'a RSlabel) -> String + 'a;
|
||||||
fn generate_edge_printing_fn<'a>(
|
// fn generate_edge_printing_fn<'a>(
|
||||||
edge_display: &[EdgeDisplay],
|
// edge_display: graph::EdgeDisplay,
|
||||||
translator: Rc<Translator>,
|
// translator: Rc<Translator>,
|
||||||
) -> Box<GraphMapEdgesFnTy<'a>> {
|
// ) -> Box<GraphMapEdgesFnTy<'a>> {
|
||||||
// The type cannot be aliased since rust doesnt like generics.
|
// // The type cannot be aliased since rust doesnt like generics.
|
||||||
// We are iterating over the edge_display and constructing a function
|
// // We are iterating over the edge_display and constructing a function
|
||||||
// (accumulator) that prints out our formatted nodes. So at each step we
|
// // (accumulator) that prints out our formatted nodes. So at each step we
|
||||||
// call the previous function and add the next string or function.
|
// // call the previous function and add the next string or function.
|
||||||
let edge_display = edge_display.iter().map(
|
// let edge_display = edge_display.iter().map(
|
||||||
|e| {
|
// |e| {
|
||||||
match e {
|
// match e {
|
||||||
EdgeDisplay::Display(d) => {
|
// EdgeDisplay::Display(d) => {
|
||||||
d.clone()
|
// d.clone()
|
||||||
},
|
// },
|
||||||
EdgeDisplay::Separator(s) => {
|
// EdgeDisplay::Separator(s) => {
|
||||||
graph::GraphMapEdges::String { string: s.clone() }
|
// graph::EdgeDisplayBase::String { string: s.clone() }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
}
|
// }
|
||||||
).collect::<Vec<_>>();
|
// ).collect::<Vec<_>>();
|
||||||
|
|
||||||
let gmet = graph::GraphMapEdgesTy::from(
|
// let gmet = graph::GraphMapEdgesTy::from(
|
||||||
(edge_display, Rc::clone(&translator))
|
// (edge_display, Rc::clone(&translator))
|
||||||
);
|
// );
|
||||||
|
|
||||||
gmet.generate()
|
// gmet.generate()
|
||||||
}
|
// }
|
||||||
|
|
||||||
/// Writes the specified graph to a file in .dot format.
|
/// Writes the specified graph to a file in .dot format.
|
||||||
pub fn dot(
|
pub fn dot(
|
||||||
system: &EvaluatedSystem,
|
system: &EvaluatedSystem,
|
||||||
node_display: graph::NodeDisplay,
|
node_display: graph::NodeDisplay,
|
||||||
edge_display: Vec<EdgeDisplay>,
|
edge_display: graph::EdgeDisplay,
|
||||||
node_color: graph::NodeColor,
|
node_color: graph::NodeColor,
|
||||||
edge_color: graph::EdgeColor
|
edge_color: graph::EdgeColor
|
||||||
) -> Result<String, String> {
|
) -> Result<String, String> {
|
||||||
@ -601,8 +593,7 @@ pub fn dot(
|
|||||||
let rc_translator = Rc::new(translator.clone());
|
let rc_translator = Rc::new(translator.clone());
|
||||||
let modified_graph = graph.map(
|
let modified_graph = graph.map(
|
||||||
node_display.generate(Rc::clone(&rc_translator), graph),
|
node_display.generate(Rc::clone(&rc_translator), graph),
|
||||||
generate_edge_printing_fn(&edge_display,
|
edge_display.generate(Rc::clone(&rc_translator), graph),
|
||||||
Rc::clone(&rc_translator)),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
let graph = Rc::new(graph.to_owned());
|
let graph = Rc::new(graph.to_owned());
|
||||||
@ -629,7 +620,7 @@ pub fn dot(
|
|||||||
pub fn graphml(
|
pub fn graphml(
|
||||||
system: &EvaluatedSystem,
|
system: &EvaluatedSystem,
|
||||||
node_display: graph::NodeDisplay,
|
node_display: graph::NodeDisplay,
|
||||||
edge_display: Vec<EdgeDisplay>,
|
edge_display: graph::EdgeDisplay,
|
||||||
) -> Result<String, String> {
|
) -> Result<String, String> {
|
||||||
match system {
|
match system {
|
||||||
EvaluatedSystem::System {
|
EvaluatedSystem::System {
|
||||||
@ -643,8 +634,8 @@ pub fn graphml(
|
|||||||
let modified_graph = graph.map(
|
let modified_graph = graph.map(
|
||||||
node_display.generate(Rc::clone(&rc_translator),
|
node_display.generate(Rc::clone(&rc_translator),
|
||||||
graph),
|
graph),
|
||||||
generate_edge_printing_fn(&edge_display,
|
edge_display.generate(rc_translator,
|
||||||
rc_translator),
|
graph),
|
||||||
);
|
);
|
||||||
|
|
||||||
use petgraph_graphml::GraphMl;
|
use petgraph_graphml::GraphMl;
|
||||||
|
|||||||
Reference in New Issue
Block a user