use tokio::sync::watch;
#[cfg(test)]
mod tests;
#[derive(Debug)]
pub struct RecentSyncLengths {
sender: watch::Sender<Vec<usize>>,
recent_lengths: Vec<usize>,
}
impl RecentSyncLengths {
pub const MAX_RECENT_LENGTHS: usize = 3;
pub fn new() -> (Self, watch::Receiver<Vec<usize>>) {
let (sender, receiver) = watch::channel(Vec::new());
(
RecentSyncLengths {
sender,
recent_lengths: Vec::with_capacity(Self::MAX_RECENT_LENGTHS),
},
receiver,
)
}
#[instrument(skip(self), fields(self.recent_lengths))]
pub fn push_obtain_tips_length(&mut self, sync_length: usize) {
self.update(sync_length)
}
#[instrument(skip(self), fields(self.recent_lengths))]
pub fn push_extend_tips_length(&mut self, sync_length: usize) {
self.update(sync_length)
}
fn update(&mut self, sync_length: usize) {
self.recent_lengths.insert(0, sync_length);
self.recent_lengths.truncate(Self::MAX_RECENT_LENGTHS);
debug!(
recent_lengths = ?self.recent_lengths,
"sending recent sync lengths"
);
let _ = self.sender.send(self.recent_lengths.clone());
}
}