Skip to content

Instantly share code, notes, and snippets.

@jadlr
Created December 9, 2016 13:19
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jadlr/b13383f830af77f3abfa8160e3523920 to your computer and use it in GitHub Desktop.
Save jadlr/b13383f830af77f3abfa8160e3523920 to your computer and use it in GitHub Desktop.
`gen_statem` example rewritten in elixir using only handle_event functions
defmodule PushButtonHandleEvents do
@behaviour :gen_statem
@name :pushbutton_statem
# Client API
def start do
:gen_statem.start({:local,@name}, __MODULE__, [], [])
end
def push do
:gen_statem.call(@name, :push)
end
def get_count do
:gen_statem.call(@name, :get_count)
end
def stop do
:gen_statem.stop(@name)
end
# Callbacks
def callback_mode, do: :handle_event_function
def init([]), do: {:ok, :off, 0}
def terminate(_reason, _state, _data), do: :void
def code_change(_vsn, state, data, _extra), do: {:ok, state, data}
# State functions
def handle_event({:call, from}, :push, :off, data), do: {:next_state, :on, data + 1, [{:reply, from, :on}]}
def handle_event({:call, from}, :push, :on, data), do: {:next_state, :off, data + 1, [{:reply, from, :off}]}
def handle_event({:call, from}, :get_count, _state, data), do: {:keep_state, data, [{:reply, from, data}]}
def handle_event(_event, _content, data), do: {:keep_state, data}
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment