Packages

A reactive programming library for Elixir. The purpose of this library is to experiment in an academic context.

Current section

Files

Jump to
reactivity lib reactive_registry.ex
Raw

lib/reactive_registry.ex

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