From 85e9fed232a6d89e3659cabbb2169cf3e21127e3 Mon Sep 17 00:00:00 2001
From: Raimo Niskanen
Date: Tue, 24 Jan 2017 14:15:26 +0100
Subject: Implement repeat_state and repeat_state_and_data
---
lib/stdlib/doc/src/gen_statem.xml | 82 +++++++++++++++++++++++++++++++++------
1 file changed, 71 insertions(+), 11 deletions(-)
(limited to 'lib/stdlib/doc/src')
diff --git a/lib/stdlib/doc/src/gen_statem.xml b/lib/stdlib/doc/src/gen_statem.xml
index 6fa2d86e0b..b20abbea5d 100644
--- a/lib/stdlib/doc/src/gen_statem.xml
+++ b/lib/stdlib/doc/src/gen_statem.xml
@@ -587,8 +587,8 @@ handle_event(_, _, State, Data) ->
- If the state machine should use state enter calls
- is selected when starting the gen_statem
+ Whether the state machine should use state enter calls
+ or not is selected when starting the gen_statem
and after code change using the return value from
Module:callback_mode/0.
@@ -606,7 +606,16 @@ handle_event(_, _, State, Data) ->
See
Module:StateName/3
and
- Module:handle_event/4.
+ Module:handle_event/4.
+ Such a call can be repeated by returning a
+
+ repeat_state
+
+ or
+
+ repeat_state_and_data
+
+ tuple from the state callback.
If
@@ -625,7 +634,8 @@ handle_event(_, _, State, Data) ->
right before entering the initial state even though this
formally is not a state change.
In this case OldState will be the same as State,
- which can not happen for a subsequent state change.
+ which can not happen for a subsequent state change,
+ but will happen when repeating the state enter call.
@@ -640,7 +650,15 @@ handle_event(_, _, State, Data) ->
-
- If the state changes or is the initial state, and
+ If the state changes, is the initial state,
+
+ repeat_state
+
+ or
+
+ repeat_state_and_data
+
+ is used, and also
state enter calls
are used, the gen_statem calls
the new state callback with arguments
@@ -1095,6 +1113,37 @@ handle_event(_, _, State, Data) ->
{next_state,CurrentState,CurrentData,Actions}.
+ repeat_state
+ -
+
+ The gen_statem keeps the current state, or
+ does a state transition to the current state if you like,
+ sets NewData,
+ and executes all Actions.
+ If the gen_statem runs with
+ state enter calls,
+ the state enter call is repeated, see type
+ transition_option(),
+ otherwise repeat_state is the same as
+ keep_state.
+
+
+ repeat_state_and_data
+ -
+
+ The gen_statem keeps the current state and data, or
+ does a state transition to the current state if you like,
+ and executes all Actions.
+ This is the same as
+ {repeat_state,CurrentData,Actions}.
+ If the gen_statem runs with
+ state enter calls,
+ the state enter call is repeated, see type
+ transition_option(),
+ otherwise repeat_state_and_data is the same as
+ keep_state_and_data.
+
+
stop
-
@@ -1870,22 +1919,33 @@ handle_event(_, _, State, Data) ->
actions
that may be returned:
postpone()
- and
+ is not allowed since a state enter call is not
+ an event so there is no event to postpone, and
{next_event,_,_}
- are not allowed.
+ is not allowed since using state enter calls
+ should not affect how events are consumed and produced.
You may also not change states from this call.
Should you return {next_state,NextState, ...}
with NextState =/= State the gen_statem crashes.
- You are advised to use {keep_state,...} or
- keep_state_and_data.
+ It is possible to use {repeat_state, ...},
+ {repeat_state_and_data,_} or
+ repeat_state_and_data but all of them makes little
+ sense since you immediately will be called again with a new
+ state enter call making this just a weird way
+ of looping, and there are better ways to loop in Erlang.
+ You are advised to use {keep_state,...},
+ {keep_state_and_data,_} or
+ keep_state_and_data since you can not change states
+ from a state enter call anyway.
Note the fact that you can use
throw
to return the result, which can be useful.
For example to bail out with throw(keep_state_and_data)
- from deep within complex code that is in no position to
- return {next_state,State,Data}.
+ from deep within complex code that can not
+ return {next_state,State,Data} because
+ State or Data is no longer in scope.
--
cgit v1.2.3