defmodule Reactivity.Registry do use GenServer require Logger alias Reactivity.Signal.Source alias Reactivity.Signal.Derived ############# # GenServer # ############# def start_link(args \\ []) do GenServer.start_link(__MODULE__, args, name: __MODULE__) end def init(args) do table = :ets.new(:sources, [:named_table, :set]) Logger.debug "Table: #{inspect table}" {:ok, table} end ############# # Callbacks # ############# def handle_cast(m, state) do Logger.debug "Cast: #{inspect m}" {:noreply, state} end def handle_call({:insert, source, name}, _from, table) do :ets.insert(table, {name, source}) {:reply, :ok, table} end def handle_call({:remove, name}, _from, table) do :ets.delete(table, name) {:reply, :ok, table} end def handle_call({:get, name}, _from, table) do case :ets.lookup(table, name) do [{^name, val}] -> {:reply, {:ok, val}, table} [] -> {:reply, {:error, "not found"}, table} end end def handle_call(m, from, state) do Logger.debug "Call: #{inspect m} from #{inspect from}" {:reply, :ok, state} end def handle_info(m, state) do Logger.debug "Info: #{inspect m}" {:noreply, state} end ########### # Private # ########### ############# # Interface # ############# def add_source(source, name) do GenServer.call(__MODULE__, {:insert, source, name}) end def remove_source(name) do GenServer.call(__MODULE__, {:remove, name}) end def get_source(name) do GenServer.call(__MODULE__, {:get, name}) end end