defmodule Topical do alias Topical.Registry def child_spec(options) do %{ id: Keyword.get(options, :server, Topical), start: {Registry, :start_link, [options]}, type: :supervisor } end def subscribe(registry, topic, pid) do with {:ok, server} <- Registry.get_topic(registry, topic) do # TODO: monitor/link server? {:ok, GenServer.call(server, {:subscribe, pid})} end end def unsubscribe(registry, topic, ref) do # TODO: don't start server if not running with {:ok, server} <- Registry.get_topic(registry, topic) do GenServer.cast(server, {:unsubscribe, ref}) end end def notify(registry, topic, action, args \\ {}) do with {:ok, server} <- Registry.get_topic(registry, topic) do GenServer.cast(server, {:notify, action, args}) end end def execute(registry, topic, action, args \\ {}) do with {:ok, server} <- Registry.get_topic(registry, topic) do {:ok, GenServer.call(server, {:execute, action, args})} end end end