use std::collections::BTreeMap;
use crate::graph::Graph;
use crate::layout::types::{EdgeLabel, NodeLabel};
pub(crate) fn add_subgraph_constraints(
g: &Graph<NodeLabel, EdgeLabel>,
cg: &mut Graph<(), ()>,
vs: &[String],
) {
let mut prev: BTreeMap<String, String> = BTreeMap::new();
let mut root_prev: Option<String> = None;
for v in vs {
let mut child: Option<String> = g.parent(v).map(|s| s.to_string());
let mut prev_child: Option<String>;
while let Some(ref c) = child {
let parent = g.parent(c).map(|s| s.to_string());
if let Some(ref p) = parent {
prev_child = prev.get(p).cloned();
prev.insert(p.clone(), c.clone());
} else {
prev_child = root_prev.clone();
root_prev = Some(c.clone());
}
if let Some(ref pc) = prev_child
&& pc != c
{
cg.set_edge(pc.clone(), c.clone(), None, None);
break;
}
child = parent;
}
}
}