use crate::core::{components::MeshRenderer, Window};
use std::collections::HashMap;
#[derive(Hash, PartialEq, Eq)]
pub enum SystemType {
Startup,
Update,
Key,
}
pub type System = dyn FnMut(&mut Window, &mut Vec<MeshRenderer>);
#[derive(Default)]
pub struct Scheduler {
systems: HashMap<SystemType, Vec<Box<System>>>,
}
impl Scheduler {
pub fn new() -> Scheduler {
Scheduler::default()
}
pub fn insert(&mut self, system_type: SystemType, system: impl FnMut(&mut Window, &mut Vec<MeshRenderer>) + 'static) {
self.systems
.entry(system_type)
.or_default()
.push(Box::new(system));
}
pub fn invoke(&mut self, system_type: SystemType, window: &mut Window, renders: &mut Vec<MeshRenderer>) {
if let Some(systems) = self.systems.get_mut(&system_type) {
for system in systems.iter_mut() {
system(window, renders);
}
}
}
}