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