#![cfg_attr(not(feature = "std"), no_std)]
#![doc(html_root_url = "https://docs.rs/out")]
#![deny(missing_docs)]
#[cfg(feature = "alloc")]
extern crate alloc;
pub mod slice;
#[cfg(feature = "alloc")]
pub mod iter;
use core::cmp::Ordering;
fn make_min_heap<T>(v: &mut [T], f: &mut impl FnMut(&T, &T) -> Ordering) {
let mut i = v.len() / 2;
while i > 0 {
i -= 1;
sift_down(v, i, f);
}
}
fn sift_down<T>(v: &mut [T], mut i: usize, f: &mut impl FnMut(&T, &T) -> Ordering) {
let len = v.len();
loop {
let left = i * 2 + 1;
if left >= len {
break;
}
let right = left + 1;
let child = if right < len && f(&v[right], &v[left]).is_lt() {
right
} else {
left
};
if f(&v[child], &v[i]).is_ge() {
break;
}
v.swap(i, child);
i = child;
}
}
fn sort_min_heap<T>(v: &mut [T], f: &mut impl FnMut(&T, &T) -> Ordering) {
let mut i = v.len();
while i > 1 {
i -= 1;
v.swap(0, i);
sift_down(&mut v[..i], 0, f);
}
}