Current section
Files
Jump to
Current section
Files
lib/live_query/query.ex
defmodule LiveQuery.Query do
@moduledoc false
@callback init(opts :: %{key: List.t()}) :: any()
@callback handle_info(msg :: any(), opts :: %{key: List.t(), value: any()}) :: any()
use GenServer
alias LiveQuery.Query.State
alias LiveQuery.PubSub
def get(server) do
GenServer.call(server, :get)
end
def start_link(opts) do
GenServer.start_link(__MODULE__, opts)
end
@impl GenServer
def init(opts) do
state = State.init(opts)
PubSub.broadcast(
state.pubsub_name,
state.key,
{:live_query, state.pubsub_name, state.key}
)
{:ok, state}
end
@impl GenServer
def handle_call(:get, _from, %State{} = state) do
{:reply, state.value, state}
end
@impl GenServer
def handle_info(msg, %State{} = state) do
new_state = State.handle_info(state, msg)
if new_state.value != state.value do
PubSub.broadcast(
state.pubsub_name,
state.key,
{:live_query, state.pubsub_name, state.key}
)
end
{:noreply, new_state}
end
end