use crate::Clock;
use crossbeam_channel::{Receiver, RecvTimeoutError};
use std::time::{Duration, Instant};
impl Clock {
#[cfg_attr(docsrs, doc(cfg(feature = "crossbeam")))]
pub fn after(&self, duration: Duration) -> Receiver<Instant> {
#[cfg(any(test, feature = "test-clock"))]
if let Some(paused) = &self.paused {
return match paused.now().checked_add(duration) {
Some(deadline) => paused.at(deadline),
None => crossbeam_channel::never(),
};
}
crossbeam_channel::after(duration)
}
#[cfg_attr(docsrs, doc(cfg(feature = "crossbeam")))]
pub fn at(&self, deadline: Instant) -> Receiver<Instant> {
#[cfg(any(test, feature = "test-clock"))]
if let Some(paused) = &self.paused {
return paused.at(deadline);
}
crossbeam_channel::at(deadline)
}
#[cfg_attr(docsrs, doc(cfg(feature = "crossbeam")))]
pub fn recv_timeout<T>(
&self,
receiver: &Receiver<T>,
timeout: Duration,
) -> Result<T, RecvTimeoutError> {
#[cfg(any(test, feature = "test-clock"))]
if let Some(paused) = &self.paused {
return match paused.now().checked_add(timeout) {
Some(deadline) => paused.recv_deadline(receiver, deadline),
None => receiver.recv().map_err(RecvTimeoutError::from),
};
}
receiver.recv_timeout(timeout)
}
#[cfg_attr(docsrs, doc(cfg(feature = "crossbeam")))]
pub fn recv_deadline<T>(
&self,
receiver: &Receiver<T>,
deadline: Instant,
) -> Result<T, RecvTimeoutError> {
#[cfg(any(test, feature = "test-clock"))]
if let Some(paused) = &self.paused {
return paused.recv_deadline(receiver, deadline);
}
receiver.recv_deadline(deadline)
}
}
#[cfg(all(test, not(loom)))]
#[cfg_attr(coverage_nightly, coverage(off))]
#[path = "tests/timers.rs"]
mod tests;