Current section

Files

Jump to
hyperview lib hyparview event_handler.ex
Raw

lib/hyparview/event_handler.ex

defmodule Hyparview.EventHandler do
@moduledoc """
Hyparview Event handler
"""
use GenServer, restart: :parmanent
alias Hyparview.Config
alias Hyparview.View
defmodule State do
@moduledoc false
defstruct cb_mod: Config.callback_module()
end
@spec add_node(Node.t(), View.t()) :: :ok
def add_node(remote_node, view) do
:ok = GenServer.cast(__MODULE__, {:add_node, remote_node, view})
end
@spec del_node(Node.t(), View.t()) :: :ok
def del_node(remote_node, view) do
:ok = GenServer.cast(__MODULE__, {:del_node, remote_node, view})
end
def start_link do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
def init(_args) do
{:ok, %State{}}
end
def handle_cast({:add_node, remote_node, view}, %State{cb_mod: cb_mod} = state) do
if MapSet.member?(view.active, remote_node), do: cb_mod.add_node(remote_node, view)
{:noreply, state}
end
def handle_cast({:del_node, remote_node, view}, %State{cb_mod: cb_mod} = state) do
unless MapSet.member?(view.active, remote_node), do: cb_mod.del_node(remote_node, view)
{:noreply, state}
end
end