use std::cmp::Ordering;
use crate::{NodeMut, NodeRef};
impl<'a, T: 'a> NodeMut<'a, T> {
pub fn sort(&mut self)
where
T: Ord,
{
self.sort_by(|a, b| a.value().cmp(b.value()));
}
pub fn sort_by<F>(&mut self, mut compare: F)
where
F: FnMut(NodeRef<T>, NodeRef<T>) -> Ordering,
{
if !self.has_children() {
return;
}
let mut children = {
let this = unsafe { self.tree.get_unchecked(self.id) };
this.children().map(|child| child.id).collect::<Vec<_>>()
};
children.sort_by(|a, b| {
let a = unsafe { self.tree.get_unchecked(*a) };
let b = unsafe { self.tree.get_unchecked(*b) };
compare(a, b)
});
for id in children {
self.append_id(id);
}
}
pub fn sort_by_key<K, F>(&mut self, mut f: F)
where
F: FnMut(NodeRef<T>) -> K,
K: Ord,
{
self.sort_by(|a, b| f(a).cmp(&f(b)));
}
}