Skip to content

Instantly share code, notes, and snippets.

@radzserg
Created January 15, 2019 12:03
Show Gist options
  • Select an option

  • Save radzserg/1733900ade66a3a5a6322bc465ae676a to your computer and use it in GitHub Desktop.

Select an option

Save radzserg/1733900ade66a3a5a6322bc465ae676a to your computer and use it in GitHub Desktop.
dispatch events
defmodule Rsed.Event do
@enforce_keys [:name]
defstruct [:name, :data]
@type t :: %Rsed.Event{
name: String.t(),
data: any(),
}
end
defmodule Rsed.EventDispatcher do
@doc """
Dispatches an event to all registered listeners and subscribers
"""
@spec dispatch(event :: Rsed.Event.t) :: term
def dispatch(event = %Rsed.Event{}) do
GenServer.cast(my_name(), {:dispatch, event})
end
def handle_cast({:dispatch, event}, state) do
Rsed.ListenersBag.get_event_handlers(state, event.name)
|> Enum.map(fn {module, func_name, _} ->
apply(module, func_name, [event])
end)
{:noreply, state}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment