File 3661-gen_statem-Make-it-possible-to-spec-data.patch of Package erlang

From 6151960b8da078b36e6b59f03cc33111d140cebd Mon Sep 17 00:00:00 2001
From: Anton Thomasson <anton.thomasson@ericsson.com>
Date: Wed, 2 Jun 2021 10:41:59 +0200
Subject: [PATCH] gen_statem: Make it possible to spec data

Add /2 variants of return types containing data, so a user can use
them to spec their implementation (with their own data type) and
thus get validation for it.
---
 lib/stdlib/doc/src/gen_statem.xml | 12 ++++++---
 lib/stdlib/src/gen_statem.erl     | 41 +++++++++++++++++++------------
 2 files changed, 33 insertions(+), 20 deletions(-)

diff --git a/lib/stdlib/doc/src/gen_statem.xml b/lib/stdlib/doc/src/gen_statem.xml
index 1fcc104013..e82a6fe4a2 100644
--- a/lib/stdlib/doc/src/gen_statem.xml
+++ b/lib/stdlib/doc/src/gen_statem.xml
@@ -1452,7 +1452,8 @@ handle_event(_, _, State, Data) ->
       </desc>
     </datatype>
     <datatype>
-      <name name="init_result"/>
+      <name name="init_result" n_vars="1"/>
+      <name name="init_result" n_vars="2"/>
       <desc>
 	<p>
 	  For a succesful initialization,
@@ -1479,7 +1480,8 @@ handle_event(_, _, State, Data) ->
       </desc>
     </datatype>
     <datatype>
-      <name name="state_enter_result"/>
+      <name name="state_enter_result" n_vars="1"/>
+      <name name="state_enter_result" n_vars="2"/>
       <desc>
 	<p>
 	  <c><anno>State</anno></c> is the current state
@@ -1502,7 +1504,8 @@ handle_event(_, _, State, Data) ->
       </desc>
     </datatype>
     <datatype>
-      <name name="event_handler_result"/>
+      <name name="event_handler_result" n_vars="1"/>
+      <name name="event_handler_result" n_vars="2"/>
       <desc>
 	<p>
 	  <c><anno>StateType</anno></c> is
@@ -1532,7 +1535,8 @@ handle_event(_, _, State, Data) ->
       </desc>
     </datatype>
     <datatype>
-      <name name="state_callback_result"/>
+      <name name="state_callback_result" n_vars="1"/>
+      <name name="state_callback_result" n_vars="2"/>
       <desc>
 	<p>
 	  <c><anno>ActionType</anno></c> is
diff --git a/lib/stdlib/src/gen_statem.erl b/lib/stdlib/src/gen_statem.erl
index e91a24fd53..e206a826ea 100644
--- a/lib/stdlib/src/gen_statem.erl
+++ b/lib/stdlib/src/gen_statem.erl
@@ -63,8 +63,11 @@
    [event_type/0,
     callback_mode_result/0,
     init_result/1,
+    init_result/2,
     state_enter_result/1,
+    state_enter_result/2,
     event_handler_result/1,
+    event_handler_result/2,
     reply_action/0,
     enter_action/0,
     action/0]).
@@ -204,9 +207,10 @@
 	{'reply', % Reply to a caller
 	 From :: from(), Reply :: term()}.
 
--type init_result(StateType) ::
-    {ok, State :: StateType, Data :: data()} |
-    {ok, State :: StateType, Data :: data(),
+-type init_result(StateType) :: init_result(StateType, term()).
+-type init_result(StateType, DataType) ::
+    {ok, State :: StateType, Data :: DataType} |
+    {ok, State :: StateType, Data :: DataType,
      Actions :: [action()] | action()} |
     'ignore' |
     {'stop', Reason :: term()}.
@@ -217,38 +221,43 @@
 -type handle_event_result() ::
 	event_handler_result(state()).
 %%
--type state_enter_result(State) ::
-	{'next_state', % {next_state,NextState,NewData,[]}
+-type state_enter_result(State) :: state_enter_result(State, term()).
+-type state_enter_result(State, DataType) ::
+	{'next_state', % {next_state,State,NewData,[]}
 	 State,
-	 NewData :: data()} |
-	{'next_state', % State transition, maybe to the same state
+	 NewData :: DataType} |
+	{'next_state', % State entry for state State
 	 State,
-	 NewData :: data(),
+	 NewData :: DataType,
 	 Actions :: [enter_action()] | enter_action()} |
 	state_callback_result(enter_action()).
 -type event_handler_result(StateType) ::
+    event_handler_result(StateType, term()).
+-type event_handler_result(StateType, DataType) ::
 	{'next_state', % {next_state,NextState,NewData,[]}
 	 NextState :: StateType,
-	 NewData :: data()} |
+	 NewData :: DataType} |
 	{'next_state', % State transition, maybe to the same state
 	 NextState :: StateType,
-	 NewData :: data(),
+	 NewData :: DataType,
 	 Actions :: [action()] | action()} |
 	state_callback_result(action()).
 -type state_callback_result(ActionType) ::
+    state_callback_result(ActionType, term()).
+-type state_callback_result(ActionType, DataType) ::
 	{'keep_state', % {keep_state,NewData,[]}
-	 NewData :: data()} |
+	 NewData :: DataType} |
 	{'keep_state', % Keep state, change data
-	 NewData :: data(),
+	 NewData :: DataType,
 	 Actions :: [ActionType] | ActionType} |
 	'keep_state_and_data' | % {keep_state_and_data,[]}
 	{'keep_state_and_data', % Keep state and data -> only actions
 	 Actions :: [ActionType] | ActionType} |
 	%%
 	{'repeat_state', % {repeat_state,NewData,[]}
-	 NewData :: data()} |
+	 NewData :: DataType} |
 	{'repeat_state', % Repeat state, change data
-	 NewData :: data(),
+	 NewData :: DataType,
 	 Actions :: [ActionType] | ActionType} |
 	'repeat_state_and_data' | % {repeat_state_and_data,[]}
 	{'repeat_state_and_data', % Repeat state and data -> only actions
@@ -259,7 +268,7 @@
 	 Reason :: term()} |
 	{'stop', % Stop the server
 	 Reason :: term(),
-	 NewData :: data()} |
+	 NewData :: DataType} |
 	%%
 	{'stop_and_reply', % Reply then stop the server
 	 Reason :: term(),
@@ -267,7 +276,7 @@
 	{'stop_and_reply', % Reply then stop the server
 	 Reason :: term(),
 	 Replies :: [reply_action()] | reply_action(),
-	 NewData :: data()}.
+	 NewData :: DataType}.
 
 
 %% The state machine init function.  It is called only once and
-- 
2.31.1

openSUSE Build Service is sponsored by