use std::{
cmp::Ordering as CompareOrdering,
sync::{
Arc,
atomic::AtomicU8,
},
time::Instant,
};
pub struct ScheduledTask {
pub deadline: Instant,
pub sequence: usize,
pub state: Arc<AtomicU8>,
pub task: Option<Box<dyn FnOnce() + Send + 'static>>,
}
impl ScheduledTask {
pub fn new(
deadline: Instant,
sequence: usize,
state: Arc<AtomicU8>,
task: Box<dyn FnOnce() + Send + 'static>,
) -> Self {
Self {
deadline,
sequence,
state,
task: Some(task),
}
}
}
impl Eq for ScheduledTask {}
impl PartialEq for ScheduledTask {
fn eq(&self, other: &Self) -> bool {
self.deadline == other.deadline && self.sequence == other.sequence
}
}
impl Ord for ScheduledTask {
fn cmp(&self, other: &Self) -> CompareOrdering {
other
.deadline
.cmp(&self.deadline)
.then_with(|| other.sequence.cmp(&self.sequence))
}
}
impl PartialOrd for ScheduledTask {
fn partial_cmp(&self, other: &Self) -> Option<CompareOrdering> {
Some(self.cmp(other))
}
}