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
alias Hyparview.Config
alias Hyparview.View
defmodule State do
@moduledoc false
defstruct [
cb_mod: Config.callback_module(),
cb_state: nil
]
end
@spec joining() :: :ok
def joining do
:ok = GenServer.cast(__MODULE__, :joining)
end
@spec joined(View.t()) :: :ok
def joined(view) do
:ok = GenServer.cast(__MODULE__, {:joined, view})
end
@spec add_node(Node.t(), View.t()) :: :ok
def add_node(node, view) do
:ok = GenServer.cast(__MODULE__, {:add_node, node, view})
end
@spec del_node(Node.t(), View.t()) :: :ok
def del_node(node, view) do
:ok = GenServer.cast(__MODULE__, {:del_node, node, view})
end
def start_link do
GenServer.start_link(__MODULE__, [], name: __MODULE__)
end
def init(_args) do
{:ok, %State{}}
end
def handle_cast(:joining, %State{cb_mod: cb_mod} = state) do
{:ok, cb_state} = cb_mod.joining()
{:noreply, %{state | cb_state: cb_state}}
end
def handle_cast({:joined, view}, %State{cb_mod: cb_mod} = state) do
{:ok, cb_state} = cb_mod.joined(view, state.cb_state)
{:noreply, %{state | cb_state: cb_state}}
end
def handle_cast({:add_node, node, view}, %State{cb_mod: cb_mod} = state) do
{:ok, cb_state} = cb_mod.add_node(node, view, state.cb_state)
{:noreply, %{state | cb_state: cb_state}}
end
def handle_cast({:del_node, node, view}, %State{cb_mod: cb_mod} = state) do
{:ok, cb_state} = cb_mod.del_node(node, view, state.cb_state)
{:noreply, %{state | cb_state: cb_state}}
end
end