Current section

Files

Jump to
ex_esdb src tracker_group.erl
Raw

src/tracker_group.erl

-module(tracker_group).
-export([join/3, members/2, group_key/2, leave/3, notify_created/3, notify_deleted/3,
notify_updated/3]).
-spec group_key(Store :: atom(), Feature :: atom()) -> integer().
group_key(Store, Feature) ->
erlang:phash2({Store, Feature, trackers}).
created(Feature, Data) ->
{feature_created, Feature, Data}.
deleted(Feature, Data) ->
{feature_deleted, Feature, Data}.
updated(Feature, Data) ->
{feature_updated, Feature, Data}.
-spec join(Store :: atom(), Feature :: atom(), PidOrPids :: pid() | [pid()]) -> ok.
join(Store, Feature, PidOrPids) ->
Group = group_key(Store, Feature),
ok = pg:join('Elixir.Phoenix.PubSub', Group, PidOrPids),
ok.
-spec members(Store :: atom(), Feature :: atom()) -> [pid()].
members(Store, Feature) ->
Group = group_key(Store, Feature),
pg:get_members('Elixir.Phoenix.PubSub', Group).
-spec leave(Store :: atom(), Feature :: atom(), PidOrPids :: pid() | [pid()]) -> ok.
leave(Store, Feature, PidOrPids) ->
Group = group_key(Store, Feature),
ok = pg:leave('Elixir.Phoenix.PubSub', Group, PidOrPids),
ok.
-spec notify_created(Store :: atom(), Feature :: atom(), Data :: map()) -> ok.
notify_created(Store, Feature, Data) ->
Msg = created(Feature, Data),
Pids = members(Store, Feature),
lists:foreach(fun(Pid) -> Pid ! Msg end, Pids).
-spec notify_deleted(Store :: atom(), Feature :: atom(), Data :: map()) -> ok.
notify_deleted(Store, Feature, Data) ->
Msg = deleted(Feature, Data),
Pids = members(Store, Feature),
lists:foreach(fun(Pid) -> Pid ! Msg end, Pids).
-spec notify_updated(Store :: atom(), Feature :: atom(), Data :: map()) -> ok.
notify_updated(Store, Feature, Data) ->
Msg = updated(Feature, Data),
Pids = members(Store, Feature),
lists:foreach(fun(Pid) -> Pid ! Msg end, Pids).