use crate::{Duration, OsInterface, Timeout};
pub trait NotifierInterface: Send + Clone {
fn notify(&self) -> bool;
}
pub trait NotifyWaiterInterface<OS: OsInterface>: Send {
fn wait(&self, timeout: &Duration<OS>) -> bool;
#[inline]
fn wait_with<U>(&self, timeout: &Duration<OS>, mut f: impl FnMut() -> Option<U>) -> Option<U> {
let mut wait_time = timeout.clone();
let mut t = Timeout::<OS>::from(timeout);
loop {
if let Some(rst) = f() {
return Some(rst);
}
if t.timeout() {
return None;
}
let left_time = t.time_left();
if left_time < wait_time {
wait_time = left_time;
}
self.wait(&wait_time);
}
}
}