use std::collections::VecDeque;
use std::time::Duration;
#[derive(Clone, Debug, Default, Eq, PartialEq)]
pub struct ControlledBackoff {
initial: Vec<Duration>,
remaining: VecDeque<Duration>,
requested: usize,
}
impl ControlledBackoff {
#[must_use]
pub fn new(delays: impl IntoIterator<Item = Duration>) -> Self {
let initial = delays.into_iter().collect::<Vec<_>>();
Self {
remaining: initial.iter().copied().collect(),
initial,
requested: 0,
}
}
pub fn next_delay(&mut self) -> Option<Duration> {
let delay = self.remaining.pop_front()?;
self.requested += 1;
Some(delay)
}
#[must_use]
pub const fn requested(&self) -> usize {
self.requested
}
pub fn reset(&mut self) {
self.remaining = self.initial.iter().copied().collect();
self.requested = 0;
}
}