use std::collections::VecDeque;
use super::ColdGcEntry;
use super::ColdGcTarget;
#[derive(Debug, Clone, Default)]
pub(super) struct ColdGcQueue {
pending: VecDeque<ColdGcEntry>,
next_seq: u64,
}
impl ColdGcQueue {
pub(super) fn from_parts(pending: Vec<ColdGcEntry>, next_seq: u64) -> Self {
Self {
pending: pending.into_iter().collect(),
next_seq,
}
}
pub(super) fn enqueue(&mut self, target: ColdGcTarget) {
self.enqueue_after(target, 0);
}
pub(super) fn enqueue_after(&mut self, target: ColdGcTarget, not_before_ms: u64) {
let seq = self.next_seq;
self.next_seq = self.next_seq.saturating_add(1);
self.pending.push_back(ColdGcEntry {
seq,
not_before_ms,
target,
});
}
pub(super) fn ack(&mut self, up_to_seq: u64) -> u64 {
let before = self.pending.len();
while self
.pending
.front()
.is_some_and(|entry| entry.seq <= up_to_seq)
{
self.pending.pop_front();
}
u64::try_from(before - self.pending.len()).expect("removed fits u64")
}
pub(super) fn batch(&self, max: usize) -> Vec<ColdGcEntry> {
self.pending.iter().take(max).cloned().collect()
}
pub(super) fn len(&self) -> usize {
self.pending.len()
}
pub(super) fn entries(&self) -> impl Iterator<Item = &ColdGcEntry> {
self.pending.iter()
}
pub(super) fn next_seq(&self) -> u64 {
self.next_seq
}
}