use crate::Event;
use crate::event::EventOnce;
use std::collections::HashMap;
use std::sync::{Arc, Mutex, RwLock};
#[derive(Debug, Clone, Default)]
pub struct EventSchedule {
events: Arc<RwLock<HashMap<Vec<u8>, Vec<Arc<dyn Event + Send + 'static>>>>>,
once_events: Arc<Mutex<HashMap<Vec<u8>, Vec<Box<dyn EventOnce + Send + 'static>>>>>,
}
impl EventSchedule {
pub async fn raw_register_event<E: Event + Send + 'static>(&self, key: Vec<u8>, event: E) {
let e = Arc::new(event);
let mut write = self.events.write().unwrap_or_else(|err| err.into_inner());
if let Some(events) = write.get_mut(key.as_slice()) {
events.push(e);
} else {
write.insert(key, vec![e]);
}
}
pub fn raw_register_once_event<E: EventOnce + Send + 'static>(&self, key: Vec<u8>, event: E) {
let e = Box::new(event);
let mut once_events = self
.once_events
.lock()
.unwrap_or_else(|err| err.into_inner());
once_events.insert(key, vec![e]);
}
pub async fn raw_load_events(&self, key: &[u8]) -> Vec<Arc<dyn Event + Send + 'static>> {
let events = self.events.read().unwrap_or_else(|err| err.into_inner());
events.get(key).cloned().unwrap_or_default()
}
pub fn raw_load_once_events(&self, key: &[u8]) -> Vec<Box<dyn EventOnce + Send + 'static>> {
let mut once_events = self
.once_events
.lock()
.unwrap_or_else(|err| err.into_inner());
once_events.remove(key).unwrap_or_default()
}
}