#[derive(Debug)]
pub struct Trees<T> {
tree_a: T,
tree_b: T,
source_is_a: bool,
}
impl<T> Trees<T> {
pub fn new(source: T, target: T) -> Self {
Self {
tree_a: source,
tree_b: target,
source_is_a: true,
}
}
#[must_use]
pub fn source(&self) -> &T {
if self.source_is_a {
&self.tree_a
} else {
&self.tree_b
}
}
#[must_use]
pub fn target(&self) -> &T {
if self.source_is_a {
&self.tree_b
} else {
&self.tree_a
}
}
#[must_use]
pub fn source_mut(&mut self) -> &mut T {
if self.source_is_a {
&mut self.tree_a
} else {
&mut self.tree_b
}
}
#[must_use]
pub fn target_mut(&mut self) -> &mut T {
if self.source_is_a {
&mut self.tree_b
} else {
&mut self.tree_a
}
}
#[must_use]
pub fn both_mut(&mut self) -> (&mut T, &mut T) {
if self.source_is_a {
(&mut self.tree_a, &mut self.tree_b)
} else {
(&mut self.tree_b, &mut self.tree_a)
}
}
pub(crate) fn swap(&mut self) {
self.source_is_a = !self.source_is_a;
}
}