use std::collections::HashMap;
#[derive(Clone, Debug, PartialEq)]
pub(crate) struct SankeyNode {
pub(crate) id: String,
pub(crate) index: usize,
}
#[derive(Clone, Debug, PartialEq)]
pub(crate) struct SankeyLink {
pub(crate) source: usize,
pub(crate) target: usize,
pub(crate) value: f64,
}
#[derive(Clone, Debug, Default)]
pub(crate) struct SankeyDb {
pub(crate) nodes: Vec<SankeyNode>,
pub(crate) links: Vec<SankeyLink>,
pub(crate) title: Option<String>,
lookup: HashMap<String, usize>,
}
impl SankeyDb {
pub(crate) fn find_or_create_node(&mut self, id: &str) -> usize {
if let Some(&i) = self.lookup.get(id) {
return i;
}
let i = self.nodes.len();
self.lookup.insert(id.to_string(), i);
self.nodes.push(SankeyNode {
id: id.to_string(),
index: i,
});
i
}
pub(crate) fn add_link(&mut self, source: usize, target: usize, value: f64) {
self.links.push(SankeyLink {
source,
target,
value,
});
}
}