defmodule MpvJsonIpc do @moduledoc """ Utilities. """ @doc false use GenServer, restart: :transient @impl true def init(_) do {:ok, []} end @impl true def handle_call(:loaded, _, to_reply) do :persistent_term.put(__MODULE__, true) to_reply |> Enum.map(&GenServer.reply(&1, :ok)) {:stop, :normal, :ok, to_reply} end @impl true def handle_call(:ensure_loaded, from, to_reply) do to_reply = [from | to_reply] {:noreply, to_reply} end @doc false def start_link(init_arg), do: GenServer.start_link(__MODULE__, init_arg, name: __MODULE__) def __loaded__, do: GenServer.call(__MODULE__, :loaded) @doc """ Checks whether the library is fully loaded. See [Properties and commands](properties-and-commands.md). """ def loaded?, do: :persistent_term.get(__MODULE__, false) @doc """ Blocks until the library is fully loaded. See [Properties and commands](properties-and-commands.md). """ def ensure_loaded() do if not loaded?() do GenServer.call(__MODULE__, :ensure_loaded, :infinity) else :ok end end @doc """ Returns a list of running supervisors. ## Examples iex> MpvJsonIpc.Mpv.Sup.start_link() {:ok, #PID<0.2884.0>} iex> MpvJsonIpc.running_sups() [{"Elixir.MpvJsonIpc.Mpv.Sup114384777898228", #PID<0.2884.0>}] """ def running_sups do Registry.MpvJsonIpc |> Registry.select([{{:"$1", :"$2", :_}, [], [{{:"$1", :"$2"}}]}]) |> Enum.filter(fn {key, _} -> key |> String.contains?("Sup") end) end end