Current section
Files
Jump to
Current section
Files
lib/flex/pub_sub.ex
defmodule Flex.PubSub do
use GenServer
def start_link(_) do
GenServer.start_link(__MODULE__, %{}, name: __MODULE__)
end
def init(state) do
{:ok, state}
end
def subscribe(topic) do
GenServer.call(__MODULE__, {:subscribe, topic, self()})
end
def broadcast(topic, message) do
GenServer.cast(__MODULE__, {:broadcast, topic, message})
end
def handle_call({:subscribe, topic, pid}, _from, state) do
new_state = Map.update(state, topic, [pid], fn pids -> [pid | pids] end)
{:reply, :ok, new_state}
end
def handle_cast({:broadcast, topic, message}, state) do
for pid <- Map.get(state, topic, []) do
send(pid, {:broadcast, topic, message})
end
{:noreply, state}
end
end