Current section
Files
Jump to
Current section
Files
lib/line-message/event.ex
defmodule LineMessage.Event do
use GenServer
def start_link do
IO.puts "Event server start"
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
def on(event_type, module, func) do
apply_func = fn -> apply(module, func, []) end
GenServer.cast(__MODULE__, {:on, event_type, module, apply_func})
end
def on(event_type, func) do
GenServer.cast(__MODULE__, {:on, event_type, func})
end
def notify(event) do
GenServer.cast(__MODULE__, {:notify, event})
end
def listeners_list do
GenServer.call(__MODULE__, :listeners)
end
def handle_cast({:on, event_type, func}, listeners) do
{:noreply, [ {event_type, func} | listeners ]}
end
def handle_cast({:notify, event}, listeners) do
Enum.each(listeners, fn {event_type, func} ->
if event_type == event.type, do: func.(event)
end)
{:noreply, listeners}
end
def handle_call(:listeners, _from, listeners) do
{:reply, listeners, listeners}
end
end