Packages
tai
0.0.39
0.0.75
0.0.74
0.0.73
0.0.72
0.0.71
0.0.70
0.0.69
0.0.68
0.0.67
0.0.66
0.0.65
0.0.64
0.0.63
0.0.62
0.0.61
0.0.60
0.0.59
0.0.58
0.0.57
0.0.56
0.0.55
0.0.54
0.0.53
0.0.52
0.0.51
0.0.50
0.0.49
0.0.48
0.0.47
0.0.46
0.0.45
0.0.44
0.0.43
0.0.42
0.0.41
0.0.40
0.0.39
0.0.38
0.0.37
0.0.36
0.0.35
0.0.34
0.0.33
0.0.32
0.0.31
0.0.30
0.0.29
0.0.28
0.0.27
0.0.26
0.0.25
0.0.24
0.0.23
0.0.22
0.0.21
0.0.20
0.0.19
0.0.18
0.0.17
0.0.16
0.0.15
0.0.14
0.0.13
0.0.12
0.0.11
0.0.10
0.0.9
0.0.8
0.0.7
0.0.6
0.0.5
0.0.4
0.0.3
0.0.2
0.0.1
A composable, real time, market data and trade execution toolkit
Current section
Files
Jump to
Current section
Files
lib/tai/advisors/store.ex
defmodule Tai.Advisors.Store do
@moduledoc """
ETS backed store for the local state of advisors
"""
use GenServer
@type store_id :: atom
@type instance :: Tai.Advisors.Instance.t()
@default_store_id :default
@default_backend Tai.Advisors.Store.Backends.ETS
defmodule State do
@type t :: %State{id: atom, name: atom, backend: atom}
defstruct ~w(id name backend)a
end
def start_link(args) do
store_id = Keyword.get(args, :id, @default_store_id)
backend = Keyword.get(args, :backend, @default_backend)
name = :"#{__MODULE__}_#{store_id}"
state = %State{id: store_id, name: name, backend: backend}
GenServer.start_link(__MODULE__, state, name: name)
end
def init(state), do: {:ok, state, {:continue, :init}}
def handle_continue(:init, state) do
:ok = state.backend.create(state.name)
{:noreply, state}
end
def handle_call({:upsert, instance}, _from, state) do
response = state.backend.upsert(instance, state.name)
{:reply, response, state}
end
def handle_call(:all, _from, state) do
response = state.backend.all(state.name)
{:reply, response, state}
end
def upsert(instance, store_id \\ @default_store_id) do
store_id
|> to_name
|> GenServer.call({:upsert, instance})
end
@spec all() :: [instance]
def all(store_id \\ @default_store_id) do
store_id
|> to_name
|> GenServer.call(:all)
end
@spec to_name(store_id) :: atom
def to_name(store_id), do: :"#{__MODULE__}_#{store_id}"
@spec default_store_id :: store_id
def default_store_id, do: @default_store_id
end