1use crate::{ecs::Universe, id::ID};
2use std::marker::PhantomData;
3
4pub enum StateChange {
5 None,
6 Push(Box<dyn State>),
7 Pop,
8 Swap(Box<dyn State>),
9 Quit,
10}
11
12pub trait State: Send + Sync {
13 fn on_enter(&mut self, _universe: &mut Universe) {}
14
15 fn on_exit(&mut self, _universe: &mut Universe) {}
16
17 fn on_pause(&mut self, _universe: &mut Universe) {}
18
19 fn on_resume(&mut self, _universe: &mut Universe) {}
20
21 fn on_process(&mut self, _universe: &mut Universe) -> StateChange {
22 StateChange::None
23 }
24
25 fn on_process_background(&mut self, _universe: &mut Universe) {}
26}
27
28impl State for () {}
29
30impl State for bool {
31 fn on_process(&mut self, _universe: &mut Universe) -> StateChange {
32 if *self {
33 StateChange::None
34 } else {
35 StateChange::Quit
36 }
37 }
38}
39
40impl State for usize {
41 fn on_process(&mut self, _universe: &mut Universe) -> StateChange {
42 if *self > 0 {
43 *self -= 1;
44 StateChange::None
45 } else {
46 StateChange::Quit
47 }
48 }
49}
50
51pub type StateToken = ID<PhantomData<dyn State + Send + Sync>>;