TIL

Pattern Namespacing with Atoms

When building systems that handle multiple concurrent clients (Discord guilds, Livebook cells, Neovim buffers), use atom-based pattern IDs for isolation:

# Discord bot - per-guild isolation
pattern_id = :"#{guild_id}:drums"
Scheduler.schedule_pattern(pattern_id, events)

# Livebook - per-cell patterns
pattern_id = :"livebook_#{cell_id}"
Scheduler.schedule_pattern(pattern_id, events)

# Neovim - per-buffer patterns
pattern_id = :"nvim_buffer_#{buffer_id}"
Scheduler.schedule_pattern(pattern_id, events)

Benefits of atom pattern IDs:

Store patterns in state:

defmodule Scheduler do
  defstruct patterns: %{}

  def handle_call({:schedule, pattern_id, events}, _from, state) do
    patterns = Map.put(state.patterns, pattern_id, events)
    {:reply, :ok, %{state | patterns: patterns}}
  end

  def handle_call({:stop, pattern_id}, _from, state) do
    patterns = Map.delete(state.patterns, pattern_id)
    {:reply, :ok, %{state | patterns: patterns}}
  end
end

Note: Atoms aren’t garbage collected, but in practice the number of unique guild/cell/buffer IDs is bounded, so this is fine.