lib/simplest_pub_sub.ex

defmodule SimplestPubSub do
  @moduledoc """
  Sub for events pub.
  """

  @doc """
  Subscribe the current process to receive events
  """
  @spec subscribe(any()) :: :ok
  def subscribe(topic) do
    with {:ok, _} <- Registry.register(SimplestPubSub.EventsRegistry, topic, []) do
      :ok
    end
  end

  @doc """
  Events are sent as messages to the subscribed processes.
  """
  @spec publish(any(), any()) :: :ok
  def publish(topic, event) do
    Registry.dispatch(SimplestPubSub.EventsRegistry, topic, fn entries ->
      for {pid, _} <- entries, do: send(pid, event)
    end)

    :ok
  end
end