Skip to content

Instantly share code, notes, and snippets.

@radzserg
Last active January 15, 2019 11:54
Show Gist options
  • Select an option

  • Save radzserg/204cb1fb43ef8282c9b0aef4e36e9ee6 to your computer and use it in GitHub Desktop.

Select an option

Save radzserg/204cb1fb43ef8282c9b0aef4e36e9ee6 to your computer and use it in GitHub Desktop.
Adding add_subscriber and add listeners
defmodule Rsed.Subscriber do
@doc """
Returns a map between event name and own event handlers
defmodule Rsed.Test.TestSubscriber2 do
@behaviour Rsed.Subscriber
def get_subscriber_events() do
%{
test_event_2: :handler_2,
test_event_3: :handler_3,
test_event_4: [
handler_4: 200,
handler_5: 100
]
}
end
def handler_2(event = %Rsed.Event{}), do: nil
def handler_3(event = %Rsed.Event{}), do: nil
def handler_4(event = %Rsed.Event{}), do: nil
def handler_5(event = %Rsed.Event{}), do: nil
end
"""
@callback get_subscriber_events() :: map()
end
defmodule Rsed.EventDispatcher do
...
@doc """
Adds an event subscriber
The subscriber is asked for all the events it is
interested in and added as a listener for these events.
"""
@spec add_subscriber(subscriber :: module()) :: term
def add_subscriber(subscriber) do
GenServer.call(my_name(), {:add_subscriber, subscriber})
end
@doc """
Adds an event listener that listens on the specified events.
"""
@spec add_listener(event_name :: String.t(), listener :: {module :: module(), callback: atom()}, priority :: integer()) :: term
def add_listener(event_name, listener, priority \\ 0) do
GenServer.call(my_name(), {:add_listener, event_name, listener, priority})
end
def handle_call({:add_subscriber, subscriber}, _from, listeners) do
listeners = Rsed.ListenersBag.add_subscriber(listeners, subscriber)
{:reply, :ok, listeners}
end
def handle_call({:add_listener, event_name, callback, priority}, _from, listeners) do
listeners = Rsed.ListenersBag.add_listener(listeners, event_name, callback, priority)
{:reply, :ok, listeners}
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment