use std::collections::VecDeque;
use std::num::NonZeroUsize;
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum CursorGapConfig {
#[default]
Disabled,
Enabled {
capacity: NonZeroUsize,
},
}
#[derive(Clone, Debug, PartialEq, Eq)]
pub struct GapObservation {
pub expected_sequence: u64,
pub delivered_sequence: u64,
pub cancelled_ranges: Vec<(u64, u64)>,
}
#[derive(Clone, Debug)]
pub(super) struct GapBuffer {
capacity: usize,
observations: VecDeque<GapObservation>,
}
impl GapBuffer {
pub(super) fn new_nonzero(capacity: NonZeroUsize) -> Self {
let capacity = capacity.get();
Self {
capacity,
observations: VecDeque::with_capacity(capacity),
}
}
pub(super) fn push(&mut self, observation: GapObservation) {
if self.observations.len() == self.capacity {
self.observations.pop_front();
}
self.observations.push_back(observation);
}
pub(super) fn take_all(&mut self) -> Vec<GapObservation> {
self.observations.drain(..).collect()
}
}