Skip to content

Instantly share code, notes, and snippets.

@rranelli
Last active February 22, 2017 18:24
Show Gist options
  • Save rranelli/5780931401621214f9de37bdd655a912 to your computer and use it in GitHub Desktop.
Save rranelli/5780931401621214f9de37bdd655a912 to your computer and use it in GitHub Desktop.
defmodule EventBus do
def init do
{:ok, _} = Registry.start_link(:duplicate, __MODULE__)
end
def register_handler(event_name, {m, f}, name \\ nil) do
name = name || "#{m}##{f}"
Registry.register(__MODULE__, event_name, {m, f, name})
end
def emit(event_name, args) do
{:ok, agent} = Agent.start_link(fn -> nil end)
Registry.dispatch __MODULE__, event_name, fn entries ->
handler_results = for {_pid, {module, function, name}} <- entries do
{name, apply(module, function, List.wrap(args))}
end
Agent.update(agent, fn _ -> handler_results end)
end
result = Agent.get(agent, & &1)
Agent.stop(agent)
result
end
end
EventBus.init
EventBus.register_handler(:puts, {IO, :puts})
EventBus.register_handler(:puts, {IO, :inspect})
EventBus.emit(:puts, "eita")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment