use super::{Memory, Storable};
use crate::substrate::{self, DefaultMemoryImpl};
use ic_memory::RuntimeMemory;
pub struct StableMinHeap<T: Storable + Ord, M: Memory = DefaultMemoryImpl> {
inner: substrate::MinHeap<T, RuntimeMemory<M>>,
}
impl<T: Storable + Ord, M: Memory> StableMinHeap<T, M> {
pub fn create(memory: RuntimeMemory<M>) -> Self {
assert_eq!(memory.size(), 0, "collection memory is not empty");
Self::reset(memory)
}
pub fn reset(memory: RuntimeMemory<M>) -> Self {
Self {
inner: substrate::MinHeap::new(memory),
}
}
pub fn load(memory: RuntimeMemory<M>) -> Self {
assert!(memory.size() > 0, "collection memory is empty");
Self {
inner: substrate::MinHeap::init(memory),
}
}
pub fn push(&mut self, item: &T) {
self.inner.push(item);
}
pub fn pop(&mut self) -> Option<T> {
self.inner.pop()
}
pub fn peek(&self) -> Option<T> {
self.inner.peek()
}
pub fn len(&self) -> u64 {
self.inner.len()
}
pub fn is_empty(&self) -> bool {
self.inner.is_empty()
}
pub fn iter(&self) -> impl Iterator<Item = T> + '_ {
self.inner.iter()
}
}