defmodule Storex do use Application @doc false def start(_type, _args) do import Supervisor.Spec, warn: false children = pg_children() ++ [ {Storex.PG, []}, {Storex.Registry, []}, {Storex.Supervisor, []} ] Supervisor.start_link(children, strategy: :one_for_one, name: __MODULE__) end if Code.ensure_loaded?(:pg) do defp pg_children() do [%{id: :pg, start: {:pg, :start_link, [Storex.PG]}}] end else defp pg_children() do [] end end @doc """ Mutate store from elixir. Invoke mutation callback globally across specified store asynchronously: ```elixir Storex.mutate("ExampleApp.Store", "reload", ["params"]) ``` """ def mutate(store, mutation, payload) do Storex.PG.broadcast({:mutate, store, mutation, payload}) end @doc """ Mutate store from elixir. Invoke mutation callback by specified key and store asynchronously: ```elixir Storex.mutate("user_id", "ExampleApp.Store", "reload", ["params"]) ``` """ def mutate(key, store, mutation, payload) do Storex.PG.broadcast({:mutate, key, store, mutation, payload}) end end