use crate::ttl_queue::TtlQueue;
#[derive(Debug, Clone)]
pub struct Inbox<T> {
queue: TtlQueue<T>,
}
impl<T> Inbox<T> {
pub fn new(capacity: usize) -> Self {
Self {
queue: TtlQueue::new(capacity),
}
}
pub(crate) fn push(&mut self, now: u64, expires_at: u64, item: T) {
self.queue.push(now, expires_at, item);
}
pub fn pop(&mut self, now: u64) -> Option<T> {
self.queue.pop(now)
}
pub fn peek(&mut self, now: u64) -> Option<&T> {
self.queue.peek(now)
}
pub fn drain(&mut self, now: u64) -> Vec<T> {
self.queue.drain(now)
}
pub fn len(&self) -> usize {
self.queue.len()
}
pub fn is_empty(&self) -> bool {
self.queue.is_empty()
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn message_ttl_respected() {
let mut inbox = Inbox::new(8);
inbox.push(100, 160, "msg");
assert_eq!(inbox.peek(100), Some(&"msg"));
assert_eq!(inbox.pop(161), None);
}
#[test]
fn different_message_ttls() {
let mut inbox = Inbox::new(8);
inbox.push(100, 110, "short");
inbox.push(100, 160, "long");
assert_eq!(inbox.pop(111), Some("long"));
}
#[test]
fn zero_expires_at_never_expires() {
let mut inbox = Inbox::new(4);
inbox.push(100, 0, "forever");
assert_eq!(inbox.pop(u64::MAX), Some("forever"));
}
}