defmodule Modbux.Model.Shared do
@moduledoc """
An agent that holds the current state of the Server/Slave DB.
"""
alias Modbux.Model
@spec start_link(any, [
{:debug, [any]}
| {:hibernate_after, :infinity | non_neg_integer}
| {:name, atom | {any, any} | {any, any, any}}
| {:spawn_opt, :link | :monitor | {any, any}}
| {:timeout, :infinity | non_neg_integer}
]) :: {:error, any} | {:ok, pid}
def start_link(params, opts \\ []) do
Agent.start_link(fn -> init(params) end, opts)
end
@spec stop(atom | pid | {atom, any} | {:via, atom, any}) :: :ok
def stop(pid) do
Agent.stop(pid)
end
@spec state(atom | pid | {atom, any} | {:via, atom, any}) :: any
def state(pid) do
Agent.get(pid, fn model -> model end)
end
@spec apply(atom | pid | {atom, any} | {:via, atom, any}, any) :: any
def apply(pid, cmd) do
Agent.get_and_update(pid, fn model -> Model.apply(model, cmd) end)
end
defp init(params) do
Keyword.fetch!(params, :model)
end
end