1use crate::ecs::{
2 commands::{ResourceCommandQueue, TriggerQueue},
3 resources::Resources,
4 system_param::{IntoSystem, System},
5};
6
7#[derive(Default)]
8pub struct Schedule {
9 systems: Vec<Box<dyn System>>,
10}
11
12impl Schedule {
13 pub fn add_system<Params: 'static>(
14 &mut self,
15 system: impl IntoSystem<Params> + 'static,
16 ) -> &mut Self {
17 self.systems.push(Box::new(system.into_system()));
18 self
19 }
20
21 pub fn run(&mut self, world: &mut hecs::World, resources: &mut Resources) {
22 for system in &mut self.systems {
23 system.run(world, &*resources);
24 }
25
26 resources.get_mut::<hecs::CommandBuffer>().run_on(world);
28
29 if resources.contains::<ResourceCommandQueue>() {
31 let commands = std::mem::take(&mut resources.get_mut::<ResourceCommandQueue>().0);
32 for command in commands {
33 command(resources);
34 }
35 }
36
37 if resources.contains::<TriggerQueue>() {
39 let triggers = std::mem::take(&mut resources.get_mut::<TriggerQueue>().0);
40 for trigger in triggers {
41 trigger(world, resources);
42 }
43 }
44 }
45}