lib/elasticlunr/utils/process.ex

defmodule Elasticlunr.Utils.Process do
  @spec child_pid?(tuple, atom) :: boolean
  def child_pid?({:undefined, pid, :worker, [mod]}, mod) when is_pid(pid), do: true
  def child_pid?(_child, _module), do: false

  @spec id_from_pid(tuple, atom, atom) :: [atom | binary]
  def id_from_pid({:undefined, pid, :worker, [mod]}, registry, mod),
    do: Registry.keys(registry, pid)

  @spec active_processes(atom, atom, atom) :: [any()]
  def active_processes(supervisor, registry, module) do
    supervisor
    |> DynamicSupervisor.which_children()
    |> Enum.filter(&child_pid?(&1, module))
    |> Enum.flat_map(&id_from_pid(&1, registry, module))
  end
end