use loaned::{take, LoanedMut};
#[derive(Debug, Default, Clone, PartialEq, Eq)]
enum Tree {
#[default]
Null,
Leaf(i32),
Node(Box<Tree>, Box<Tree>),
}
#[cfg_attr(test, test)]
fn main() {
let (a, b, c) = new_node();
*b = Tree::Leaf(1);
let (x, y, z) = new_node();
*y = Tree::Leaf(2);
x.place(c);
*z = Tree::Leaf(3);
let a = take!(a);
println!("{a:?}");
assert_eq!(format!("{a:?}"), "Node(Leaf(1), Node(Leaf(2), Leaf(3)))");
}
fn new_node<'t>() -> (LoanedMut<'t, Tree>, &'t mut Tree, &'t mut Tree) {
let ((left, right), root) = LoanedMut::loan_with(
Tree::Node(Default::default(), Default::default()),
|tree, l| {
let Tree::Node(left, right) = tree else {
unreachable!()
};
(l.loan_mut(left), l.loan_mut(right))
},
);
(root, left, right)
}