use reedline::HistoryItemId;
use std::collections::VecDeque;
#[derive(Debug, Default)]
pub struct SpongeQueue {
queue: VecDeque<Option<HistoryItemId>>,
}
impl SpongeQueue {
pub fn new() -> Self {
Self {
queue: VecDeque::new(),
}
}
pub fn record_command(
&mut self,
failed: bool,
history_id: Option<HistoryItemId>,
delay: usize,
) -> Option<HistoryItemId> {
let entry = if failed { history_id } else { None };
self.queue.push_front(entry);
if self.queue.len() > delay
&& let Some(old_entry) = self.queue.pop_back()
{
return old_entry;
}
None
}
pub fn drain_failed_ids(&mut self) -> impl Iterator<Item = HistoryItemId> + '_ {
std::iter::from_fn(move || {
while let Some(entry) = self.queue.pop_back() {
if let Some(id) = entry {
return Some(id);
}
}
None
})
}
pub fn is_empty(&self) -> bool {
self.queue.is_empty()
}
}