use std::collections::BinaryHeap;
use std::sync::{Condvar, Mutex};
use crate::Prioritized;
#[derive(Debug)]
pub struct PriorityQueue<T> {
q: Mutex<BinaryHeap<Prioritized<T>>>,
cv: Condvar,
}
impl<T> Default for PriorityQueue<T> {
fn default() -> Self {
Self::new()
}
}
impl<T> PriorityQueue<T> {
pub fn new() -> PriorityQueue<T> {
PriorityQueue {
q: Mutex::default(),
cv: Condvar::new(),
}
}
pub fn push(&self, t: T, priority: u64) {
let mut q = self.q.lock().unwrap();
q.push(Prioritized { t, priority });
drop(q);
self.cv.notify_one();
}
pub fn pop(&self) -> T {
let mut q = self.q.lock().unwrap();
while q.is_empty() {
q = self.cv.wait(q).unwrap();
}
q.pop().unwrap().t
}
}