use std::cmp::Reverse;
use std::collections::BinaryHeap;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub(crate) struct BucketOffer {
pub(crate) expiration_ms: u64,
pub(crate) bucket_index: usize,
}
#[derive(Debug, Default)]
pub(crate) struct DelayQueue {
offers: BinaryHeap<Reverse<BucketOffer>>,
}
impl DelayQueue {
pub(crate) fn offer(&mut self, offer: BucketOffer) {
self.offers.push(Reverse(offer));
}
pub(crate) fn peek(&self) -> Option<BucketOffer> {
self.offers.peek().map(|Reverse(offer)| *offer)
}
pub(crate) fn poll(&mut self) -> Option<BucketOffer> {
self.offers.pop().map(|Reverse(offer)| offer)
}
}
#[cfg(test)]
mod tests {
use super::{BucketOffer, DelayQueue};
#[test]
fn delay_queue_orders_by_expiration() {
let mut queue = DelayQueue::default();
queue.offer(BucketOffer {
expiration_ms: 20,
bucket_index: 2,
});
queue.offer(BucketOffer {
expiration_ms: 10,
bucket_index: 1,
});
assert_eq!(queue.poll().expect("first").expiration_ms, 10);
assert_eq!(queue.poll().expect("second").expiration_ms, 20);
}
}