Packages
x3m_system
0.8.0
0.9.1
0.9.0
0.8.6
0.8.5
0.8.4
0.8.3
0.8.2
0.8.1
0.8.0
retired
0.7.20
0.7.19
0.7.18
0.7.17
0.7.16
0.7.15
0.7.14
0.7.13
0.7.12
0.7.11
0.7.10
0.7.9
0.7.8
retired
0.7.7
0.7.6
retired
0.7.5
0.7.4
retired
0.7.3
retired
0.7.2
0.7.1
0.7.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
retired
0.5.6
0.5.5
0.5.4
0.5.3
0.5.2
0.5.1
0.5.0
0.4.9
0.4.8
0.4.7
0.4.6
0.4.5
0.4.4
0.4.3
0.4.2
0.4.1
0.4.0
0.1.1
0.1.0
Building blocks for distributed and/or CQRS/ES systems
Retired package: Release invalid - Pushed by mistake
Current section
Files
Jump to
Current section
Files
lib/service_registry/implementation.ex
defmodule X3m.System.ServiceRegistry.Implementation do
@moduledoc false
alias X3m.System.ServiceRegistry.State
@spec register_remote_services({node, [{atom, atom}]}, State.t()) :: {:ok, State.t()}
def register_remote_services(
{node, services},
%State{services: %State.Services{remote: remote_services}} = state
) do
services = %State.Services{
state.services
| remote: _register_remote_services(remote_services, services, node)
}
{:ok, %{state | services: services}}
end
@spec remove_remote_services(State.Services.remote_services(), node) ::
State.Services.remote_services()
def remove_remote_services(services, node) do
services
|> Enum.map(fn {service, nodes} ->
nodes =
nodes
|> Enum.reject(fn
{^node, _} -> true
_ -> false
end)
|> Enum.into(%{})
{service, nodes}
end)
|> Enum.reject(fn
{_, %{} = map} when map_size(map) == 0 -> true
_ -> false
end)
|> Enum.into(%{})
end
@spec _register_remote_services(State.Services.remote_services(), [{atom, atom}], node) ::
State.Services.remote_services()
defp _register_remote_services(existing_services, new_services, node) do
new_services
|> Enum.reduce(existing_services, fn {new_service, mod}, acc ->
acc
|> Map.put_new(new_service, %{})
|> put_in([new_service, node], mod)
end)
end
end