1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
pub use double_dot_macro::*;
pub use bevy::prelude::*;

#[derive(Debug, Clone)]
pub enum DoubleStateTransition<S>
where
    S: DoubleStates
{
    Linear,
    Arbitrary(S)
}

#[derive(Debug, Clone)]
pub struct DoubleStateEvent<S: DoubleStates>(pub DoubleStateTransition<S>);


fn watch_state_event<S: DoubleStates + States>(
    mut state_event: EventReader<DoubleStateEvent<S>>,
    mut next_state: ResMut<NextState<S>>,
    state: Res<State<S>>
) {
    for event in state_event.iter() {
        match &event.0 {
            DoubleStateTransition::Linear => {
                // info!("{:?}", state.0.linear_transition());
                next_state.set(state.0.linear_transition())
            },
            DoubleStateTransition::Arbitrary(arb_state) => {
                // info!("{:?}", state.0.arbitrary_transition(&arb_state));
                next_state.set(state.0.arbitrary_transition(&arb_state))
            },
        }
    }
}

pub trait AppExt {
    fn add_double_state<S: DoubleStates + States>(&mut self) -> &mut Self;
}

impl AppExt for App {
    fn add_double_state<S: DoubleStates + States>(&mut self) -> &mut Self {
        self
            .add_state::<S>()
            .add_event::<DoubleStateEvent<S>>()
            .add_system(watch_state_event::<S>)
    }
}