use std::{fmt::Debug, hash::Hash, mem};
use crate::path::Path;
use super::{DiffTree, NodeIDX, Tree};
impl<N, B> DiffTree<N, B>
where
N: Debug + Clone + PartialEq,
B: Clone + Debug + Default + PartialEq + Eq + PartialOrd + Ord + Hash,
{
pub fn mirror_sub_tree(&mut self, tree: &Tree<N, B>, path: &Path<B>, now: bool) {
let root_t = tree.get_idx(path, None).unwrap();
let root_s = if let Ok(root_s) = self.get_idx(path, None) {
root_s
} else {
self.extend(path, None)
};
self.mirror_sub_tree_at(tree, root_s, root_t, now)
}
pub(super) fn mirror_sub_tree_at(
&mut self,
tree: &Tree<N, B>,
idx_s: NodeIDX,
idx_t: NodeIDX,
now: bool,
) {
if now {
self.nodes[idx_s].value.1 = Some(tree.nodes[idx_t].value.clone());
} else {
self.nodes[idx_s].value.0 = Some(tree.nodes[idx_t].value.clone());
}
self.mirror_sub_tree_rec(tree, idx_s, idx_t, now);
}
pub fn mirror_sub_tree_rec(
&mut self,
tree: &Tree<N, B>,
idx_s: NodeIDX,
idx_t: NodeIDX,
now: bool,
) {
for (branch, &c_idx_t) in &tree.nodes[idx_t].children {
let c_idx_s = if let Some(&c_idx_s) = self.nodes[idx_s].children.get(branch) {
if now {
self.nodes[c_idx_s].value.1 = Some(tree.nodes[c_idx_t].value.clone());
} else {
self.nodes[c_idx_s].value.0 = Some(tree.nodes[c_idx_t].value.clone());
}
c_idx_s
} else {
self.insert_at(
idx_s,
branch.clone(),
if now {
(None, Some(tree.nodes[c_idx_t].value.clone()))
} else {
(Some(tree.nodes[c_idx_t].value.clone()), None)
},
);
self.nodes[idx_s].children[branch]
};
self.mirror_sub_tree_rec(tree, c_idx_s, c_idx_t, now);
}
}
}
impl<N, B> DiffTree<N, B>
where
N: Debug + PartialEq,
B: Clone + Debug + Default + PartialEq + Eq + PartialOrd + Ord + Hash,
{
pub fn rev(&mut self) {
for node in self.nodes.iter_mut() {
mem::swap(&mut node.value.0, &mut node.value.1);
}
}
}