Skip to content

Instantly share code, notes, and snippets.

@leikind
Created December 15, 2011 22:59
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save leikind/1483379 to your computer and use it in GitHub Desktop.
Save leikind/1483379 to your computer and use it in GitHub Desktop.
-module(cat_fsm).
-behaviour(gen_fsm).
% gen_fsm behavior implementation
-export([ init/1, handle_event/3, handle_sync_event/4, handle_info/3, terminate/3, code_change/4]).
% states
-export([ dont_give_crap/3]).
% test
-export([ test/0]).
%% client stuff
event(Pid, Event) ->
gen_fsm:sync_send_event(Pid, Event, 5000).
%% gen_fsm chrome
init(_State) ->
{ok, dont_give_crap, []}.
terminate(Reason, StateName, _StateData) ->
io:format("terminating with reason ~p at state ~p~n",[Reason, StateName]),
ok.
code_change(_OldVsn, StateName, Data, _Extra) ->
{ok, StateName, Data}.
handle_info(Info, StateName, Data) ->
io:format("~p received unknown event ~p while in state ~p~n", [self(), Info, StateName]),
{next_state, StateName, Data}.
%% State Transitions
dont_give_crap(_Event, _From, StateData) ->
io:format("Switching to 'dont_give_crap' state~n"),
{reply, ok, dont_give_crap, StateData}.
handle_event(shutdown, _StateName, StateData) ->
{stop, normal, StateData};
handle_event(Event, StateName, StateData) ->
io:format("Cat receives an unknown global event: ~p ~n", [Event]),
{next_state, StateName, StateData}.
handle_sync_event(shutdown, _From, StateName, _StateData) ->
{stop, normal, ok, StateName};
handle_sync_event(Event, _From, StateName, StateData) ->
io:format("Cat receives an unknown global sync event: ~p ~n", [Event]),
{reply, ok, StateName,StateData,5000}.
%% test
test() ->
spawn(fun() ->
{ok, Pid} = gen_fsm:start_link(?MODULE, [], []),
lists:foreach(fun(Action)->
Reply = event(Pid, Action),
io:format("Cat replied: ~p ~n", [Reply])
end, [pet, love, cherish]),
gen_fsm:sync_send_all_state_event(Pid, hello),
gen_fsm:send_all_state_event(Pid, how_are_you),
gen_fsm:sync_send_all_state_event(Pid, shutdown)
end).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment