/
fsm_auth.erl
49 lines (40 loc) · 1.3 KB
/
fsm_auth.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
-module(fsm_auth).
-export([start/0, loop/0]).
logged_in({send_message, Message}, #{messages := Messages} = Context) ->
{keep_state, Context#{messages := [Message | Messages]}};
logged_in(log_out, _Context) ->
{next_state, logged_out};
logged_in(_Event, Context) ->
{keep_state, Context}.
logged_out(log_in, _Context) ->
{next_state, logged_in};
logged_out(_Event, Context) ->
{keep_state, Context}.
call_state_handler(State, Context, Event) ->
case State of
logged_in ->
logged_in(Event, Context);
logged_out ->
logged_out(Event, Context)
end.
loop() ->
InitialState = logged_out,
InitialContext = #{messages => []},
loop(InitialState, InitialContext).
loop(State, Context) ->
io:format("State: ~p with context: ~p~n", [State, Context]),
receive
{event, Event} ->
HandlerReturn = call_state_handler(State, Context, Event),
case HandlerReturn of
{keep_state, NewContext} ->
loop(State, NewContext);
{next_state, NewState} ->
loop(NewState, Context)
end;
{state, From} ->
From ! {{state, State}, {context, Context}},
loop(State, Context)
end.
start() ->
spawn(fsm_auth, loop, []).