use std::collections::BTreeMap;
use bytes::Bytes;
use crate::types::Lsn;
pub struct ReplicationQueue {
ops: BTreeMap<Lsn, Bytes>,
}
impl ReplicationQueue {
pub fn new() -> Self {
Self {
ops: BTreeMap::new(),
}
}
pub fn push(&mut self, lsn: Lsn, data: Bytes) {
self.ops.insert(lsn, data);
}
pub fn ops_from(&self, from_lsn: Lsn) -> Vec<(Lsn, Bytes)> {
self.ops
.range(from_lsn..)
.map(|(&lsn, data)| (lsn, data.clone()))
.collect()
}
pub fn gc(&mut self, acked_lsn: Lsn) {
let keep = self.ops.split_off(&(acked_lsn + 1));
self.ops = keep;
}
pub fn len(&self) -> usize {
self.ops.len()
}
pub fn is_empty(&self) -> bool {
self.ops.is_empty()
}
pub fn clear(&mut self) {
self.ops.clear();
}
}
impl Default for ReplicationQueue {
fn default() -> Self {
Self::new()
}
}