@@ -42,7 +42,7 @@ use proptest::test_runner::TestRunner;
4242/// The reference state machine generation runs before the generated transitions
4343/// are attempted to be executed against the SUT (the concrete state machine)
4444/// as defined by [`crate::StateMachineTest`].
45- pub trait ReferenceStateMachine {
45+ pub trait ReferenceStateMachine : ' static {
4646 /// The reference state machine's state type. This should contain the minimum
4747 /// required information needed to implement the state machine. It is used
4848 /// to drive the generations of transitions to decide which transitions are
@@ -140,28 +140,33 @@ pub trait ReferenceStateMachine {
140140/// any.
141141pub struct Sequential < State , Transition , StateStrategy , TransitionStrategy > {
142142 size : SizeRange ,
143- init_state : fn ( ) -> StateStrategy ,
144- preconditions : fn ( state : & State , transition : & Transition ) -> bool ,
145- transitions : fn ( state : & State ) -> TransitionStrategy ,
146- next : fn ( state : State , transition : & Transition ) -> State ,
143+ init_state : Arc < dyn Fn ( ) -> StateStrategy > ,
144+ preconditions : Arc < dyn Fn ( & State , & Transition ) -> bool > ,
145+ transitions : Arc < dyn Fn ( & State ) -> TransitionStrategy > ,
146+ next : Arc < dyn Fn ( State , & Transition ) -> State > ,
147147}
148148
149149impl < State , Transition , StateStrategy , TransitionStrategy >
150150 Sequential < State , Transition , StateStrategy , TransitionStrategy >
151+ where
152+ State : ' static ,
153+ Transition : ' static ,
154+ StateStrategy : ' static ,
155+ TransitionStrategy : ' static ,
151156{
152157 pub fn new (
153158 size : SizeRange ,
154- init_state : fn ( ) -> StateStrategy ,
155- preconditions : fn ( state : & State , transition : & Transition ) -> bool ,
156- transitions : fn ( state : & State ) -> TransitionStrategy ,
157- next : fn ( state : State , transition : & Transition ) -> State ,
159+ init_state : impl Fn ( ) -> StateStrategy + ' static ,
160+ preconditions : impl Fn ( & State , & Transition ) -> bool + ' static ,
161+ transitions : impl Fn ( & State ) -> TransitionStrategy + ' static ,
162+ next : impl Fn ( State , & Transition ) -> State + ' static ,
158163 ) -> Self {
159164 Self {
160165 size,
161- init_state,
162- preconditions,
163- transitions,
164- next,
166+ init_state : Arc :: new ( init_state ) ,
167+ preconditions : Arc :: new ( preconditions ) ,
168+ transitions : Arc :: new ( transitions ) ,
169+ next : Arc :: new ( next ) ,
165170 }
166171 }
167172}
@@ -231,8 +236,8 @@ impl<
231236 initial_state,
232237 is_initial_state_shrinkable : true ,
233238 last_valid_initial_state,
234- preconditions : self . preconditions ,
235- next : self . next ,
239+ preconditions : self . preconditions . clone ( ) ,
240+ next : self . next . clone ( ) ,
236241 transitions,
237242 acceptable_transitions,
238243 included_transitions,
@@ -288,9 +293,9 @@ pub struct SequentialValueTree<
288293 /// to back to it in case the shrinking is rejected.
289294 last_valid_initial_state : State ,
290295 /// The pre-conditions predicate
291- preconditions : fn ( & State , & Transition ) -> bool ,
296+ preconditions : Arc < dyn Fn ( & State , & Transition ) -> bool > ,
292297 /// The function from current state and a transition to an updated state
293- next : fn ( State , & Transition ) -> State ,
298+ next : Arc < dyn Fn ( State , & Transition ) -> State > ,
294299 /// The list of transitions' value trees
295300 transitions : Vec < TransitionValueTree > ,
296301 /// The sequence of included transitions with their shrinking state
0 commit comments