Last active
January 15, 2019 11:54
-
-
Save radzserg/204cb1fb43ef8282c9b0aef4e36e9ee6 to your computer and use it in GitHub Desktop.
Adding add_subscriber and add listeners
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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