use super::{Event, EventFunc};
use queued_rust::SortedQueue;
use chrono::{DateTime, Duration, Utc};
pub struct Scheduler {
queue: SortedQueue<Event>, }
impl Scheduler {
pub fn new() -> Self {
Self {
queue: SortedQueue::new(false),
}
}
pub fn get_event_count(&self) -> usize {
self.queue.len()
}
pub fn is_empty(&self) -> bool {
self.queue.len() == 0
}
pub fn schedule_date(&mut self, end_date: DateTime<Utc>, func: EventFunc) {
let item = Event::new(end_date, func);
self.queue.add(item);
}
pub fn schedule_wait_from_now(&mut self, wait: Duration, func: EventFunc) {
let end_date = Utc::now() + wait;
let item = Event::new(end_date, func);
self.queue.add(item);
}
pub fn schedule_event(&mut self, event: Event) {
self.queue.add(event);
}
pub fn check(&mut self) -> bool {
let mut has_expired = false;
while let Some(item) = self.queue.first() {
if item.has_expired() {
if let Some(item) = self.queue.pop() {
item.execute(); has_expired = true;
}
} else {
break; }
}
has_expired
}
}