Current section

Files

Jump to
extreme_system lib system aggregate_group.ex
Raw

lib/system/aggregate_group.ex

defmodule Extreme.System.AggregateGroup do
use Supervisor
alias Extreme.System.AggregateSup
alias Extreme.System.PidRegistry
def start_link(group_name, aggregate_module) do
name = "#{group_name}.AggregateGroup" |> String.to_atom
Supervisor.start_link __MODULE__, {group_name, aggregate_module}, name: name
end
def spawn_new(group_name, key, child_params \\ []) do
{:ok, pid} = group_name |> sup_name |> AggregateSup.start_child(child_params)
:ok = group_name |> registry_name |> PidRegistry.register(key, pid)
{:ok, pid}
end
def get_registered(group_name, key),
do: group_name |> registry_name |> PidRegistry.get(key)
def init({group_name, aggregate_module}) do
children = [
supervisor( AggregateSup, [aggregate_module, [name: sup_name(group_name)]]),
worker( PidRegistry, [[name: registry_name(group_name)]])
]
supervise children, strategy: :one_for_all
end
defp sup_name(group_name), do: "#{group_name}.AggregateSup" |> String.to_atom
defp registry_name(group_name), do: "#{group_name}.AggregateRegistry" |> String.to_atom
end