1use state_validation::StateFilter;
2
3use crate::{
4 priority::{Priority, PriorityMut, PriorityStack},
5 requirements::ActionRequirement,
6};
7
8pub trait ActionSource: Sized {
9 type Source: Send + Sync;
11 fn source(&self) -> &Self::Source;
13}
14pub trait IncitingAction<State, Input>: IncitingActionInfo<State> {
19 type Requirement: ActionRequirement<Priority<State>, Input>;
21
22 fn resolve(
23 self,
24 priority: PriorityMut<Priority<State>>,
25 input: <<Self::Requirement as ActionRequirement<
26 Priority<State>,
27 Input,
28 >>::Filter as StateFilter<Priority<State>, Input>>::ValidOutput,
29 ) -> Self::Resolved;
30}
31pub trait IncitingActionInfo<State> {
32 type Resolved;
34 type Stackable;
36}
37
38pub trait StackAction<State, Input, IncitingAction: crate::actions::IncitingActionInfo<State>> {
43 type Requirement: ActionRequirement<PriorityStack<State, IncitingAction>, Input>;
45
46 type Resolved;
48 fn resolve(
49 self,
50 priority: PriorityMut<PriorityStack<State, IncitingAction>>,
51 input: <<Self::Requirement as ActionRequirement<
52 PriorityStack<State, IncitingAction>,
53 Input,
54 >>::Filter as StateFilter<PriorityStack<State, IncitingAction>, Input>>::ValidOutput,
55 ) -> Self::Resolved;
56}