npc_engine_utils/
option_state_diff.rs1use npc_engine_core::{Domain, StateDiffRef, StateDiffRefMut};
7use std::hash::Hash;
8
9pub trait OptionDiffDomain {
17 type Domain: Domain<State = Self::State, Diff = Option<Self::State>>;
18 type State: Clone;
19 fn get_cur_state(
21 state_diff: StateDiffRef<Self::Domain>,
22 ) -> &<<Self as OptionDiffDomain>::Domain as Domain>::State {
23 if let Some(diff) = state_diff.diff {
24 diff
25 } else {
26 state_diff.initial_state
27 }
28 }
29 fn get_cur_state_mut(
31 state_diff: StateDiffRefMut<Self::Domain>,
32 ) -> &mut <<Self as OptionDiffDomain>::Domain as Domain>::State {
33 if let Some(diff) = state_diff.diff {
34 diff
35 } else {
36 let diff = state_diff.initial_state.clone();
37 *state_diff.diff = Some(diff);
38 &mut *state_diff.diff.as_mut().unwrap()
39 }
40 }
41}
42
43impl<
44 S: std::fmt::Debug + Sized + Clone + Hash + Eq,
45 DA: std::fmt::Debug + Default,
46 D: Domain<State = S, Diff = Option<S>, DisplayAction = DA>,
47 > OptionDiffDomain for D
48{
49 type Domain = D;
50 type State = <D as Domain>::State;
51}