use std::time::Duration;
use tokio::time::Instant;
use super::{CovSubscriptionKey, MultipleContextKey, TimedHistories, UntimedReference};
impl TimedHistories {
pub(in crate::cov) fn reset_untimed(
&mut self,
key: &CovSubscriptionKey,
generation: u64,
delay: u32,
) {
self.remove(key);
self.untimed.insert(
key.clone(),
UntimedReference {
generation,
delay: Duration::from_secs(u64::from(delay)),
owed_since: None,
},
);
}
pub(crate) fn take_owed(
&mut self,
key: &CovSubscriptionKey,
generation: u64,
) -> Option<Instant> {
self.untimed
.get_mut(key)
.filter(|reference| reference.generation == generation)?
.owed_since
.take()
}
pub(super) fn owe(&mut self, key: &CovSubscriptionKey, generation: u64, since: Instant) {
let Some(reference) = self
.untimed
.get_mut(key)
.filter(|reference| reference.generation == generation)
else {
return;
};
if reference.owed_since.is_none_or(|owed| since < owed) {
reference.owed_since = Some(since);
self.wake.notify_one();
}
}
pub(super) fn owes(&self, context: &MultipleContextKey) -> bool {
self.untimed.iter().any(|(key, reference)| {
reference.owed_since.is_some() && key.multiple_context() == Some(context)
})
}
}