use crate::Sodg;
use log::debug;
use std::collections::HashMap;
impl Sodg {
pub fn merge(&mut self, g: &Sodg) {
let mut matcher: HashMap<u32, u32> = HashMap::new();
let mut next = self.next_id();
for (v, vtx) in g.vertices.iter() {
let mut id = 0;
if *v != 0 {
id = next;
next += 1;
}
matcher.insert(*v, id);
self.vertices.insert(id, vtx.clone());
}
for v in matcher.values() {
let vtx = self.vertices.get_mut(v).unwrap();
for e in vtx.edges.iter_mut() {
e.to = *matcher.get(v).unwrap();
}
}
debug!(
"Merged {} vertices into the existing Sodg",
g.vertices.len()
);
}
}
#[cfg(test)]
use anyhow::Result;
#[test]
fn merges_two_graphs() -> Result<()> {
let mut g = Sodg::empty();
g.add(0)?;
g.add(1)?;
g.bind(0, 1, "foo")?;
let mut extra = Sodg::empty();
extra.add(0)?;
extra.add(1)?;
extra.bind(0, 1, "bar")?;
g.merge(&extra);
assert_eq!(3, g.vertices.len());
Ok(())
}