lib/pistis/core/supervisor.ex

defmodule Pistis.Core.Supervisor do
  use DynamicSupervisor

  @me __MODULE__

  @type init_return :: %{
    extra_arguments: list,
    intensity: non_neg_integer,
    max_children: :infinity | non_neg_integer,
    period: pos_integer,
    strategy: :one_for_one
  }

  @spec start_link(any) :: :ignore | {:error, any} | {:ok, pid}
  @spec init(any) :: {:ok, init_return}
  @spec supervise(atom) :: any

  def start_link(init_arg \\ []) do
    DynamicSupervisor.start_link(@me, init_arg, name: @me)
  end

  @impl DynamicSupervisor
  def init(_init_arg), do: DynamicSupervisor.init(strategy: :one_for_one)

  def supervise(process_module) do
    case start_child(process_module) do
      {:ok, pid} -> pid
      {:error, {:already_started, pid}} -> pid
    end
  end

  defp start_child(process_module), do: DynamicSupervisor.start_child(@me, {process_module, []})
end