use std::{ops::DerefMut, sync::Arc, time::Duration};
use parking_lot::RwLock;
use crate::model::SId;
pub type WakeRef = Arc<RwLock<bool>>;
pub fn wake(wref: &WakeRef) -> bool {
let mut val = wref.write();
let val = val.deref_mut();
let res = !*val;
*val = true;
res
}
pub fn reset(wref: &WakeRef) -> bool {
let mut val = wref.write();
let val = val.deref_mut();
let res = *val;
*val = false;
res
}
#[derive(Debug, Default)]
pub struct Waker {
pub pid: SId,
pub at: Option<Duration>,
pub with: WakeRef,
}
impl Waker {
pub fn woken(&self, dur: &Duration) -> bool {
if let Some(at) = &self.at {
if at <= dur { return true; }
}
*self.with.read()
}
pub fn waker(&self) -> Box<dyn Fn()> {
let clone = self.with.clone();
let func = move || {
let mut val = clone.write();
let val = val.deref_mut();
*val = true;
};
Box::new(func)
}
}