Triple Arena Rendering
A crate enabling trait-based visualization of graphs in triple_arena::Arena<P, T>s.
There is still work to do with better compactness of large graphs, but the SVG rendering is mostly
complete.
In the future, we could have more rendering styles and backends.
use triple_arena::prelude::*;
use triple_arena_render::{render_to_svg_file, DebugNode, DebugNodeTrait};
enum MyNode<P: PtrTrait> {
Literal(i64),
Negation(Ptr<P>),
Summation(Vec<Ptr<P>>),
}
use MyNode::*;
impl<P: PtrTrait> DebugNodeTrait<P> for MyNode<P> {
fn debug_node(this: &Self) -> DebugNode<P> {
match this {
Literal(x) => {
DebugNode {
sources: vec![],
center: vec![format!("{}", x)],
sinks: vec![],
}
}
Negation(p) => {
DebugNode {
sources: vec![(*p, String::new())],
center: vec!["-".to_owned()],
sinks: vec![],
}
}
Summation(v) => {
DebugNode {
sources: v
.iter()
.enumerate()
.map(|(i, p)| (*p, format!("in{}", i)))
.collect(),
center: vec!["+".to_owned()],
sinks: vec![],
}
}
}
}
}
ptr_trait_struct_with_gen!(P0);
fn main() {
let mut a: Arena<P0, MyNode<P0>> = Arena::new();
let lit42 = a.insert(Literal(42));
let neg_lit42 = a.insert(Negation(lit42));
let lit256 = a.insert(Literal(256));
let lit7 = a.insert(Literal(7));
let inner_sum = a.insert(Summation(vec![lit256, lit7]));
let will_be_removed = a.insert(Literal(10));
let _sum = a.insert(Summation(vec![neg_lit42, inner_sum, will_be_removed]));
a.remove(will_be_removed).unwrap();
render_to_svg_file(
&a,
false,
std::path::PathBuf::from("./example.svg".to_owned()),
)
.unwrap();
}
