Packages
tai
0.0.6
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/exchanges/fees.ex
defmodule Tai.Exchanges.Fees do
use GenServer
@type fee_info :: Tai.Exchanges.FeeInfo.t()
def start_link(_) do
{:ok, pid} = GenServer.start_link(__MODULE__, :ok, name: __MODULE__)
GenServer.call(pid, :create_ets_table)
{:ok, pid}
end
def init(state) do
{:ok, state}
end
def handle_call(:create_ets_table, _from, state) do
create_ets_table()
{:reply, :ok, state}
end
def handle_call({:upsert, fee_info}, _from, state) do
key = {fee_info.exchange_id, fee_info.account_id, fee_info.symbol}
record = {key, fee_info}
:ets.insert(__MODULE__, record)
{:reply, :ok, state}
end
def handle_call(:clear, _from, state) do
:ets.delete(__MODULE__)
create_ets_table()
{:reply, :ok, state}
end
@spec upsert(fee_info) :: :ok
def upsert(%Tai.Exchanges.FeeInfo{} = fee_info) do
GenServer.call(__MODULE__, {:upsert, fee_info})
end
@spec clear :: :ok
def clear() do
GenServer.call(__MODULE__, :clear)
end
@spec find_by(exchange_id: atom, account_id: atom, symbol: atom) ::
{:ok, fee_info} | {:error, :not_found}
def find_by(exchange_id: exchange_id, account_id: account_id, symbol: symbol) do
with key <- {exchange_id, account_id, symbol},
[[%Tai.Exchanges.FeeInfo{} = fee_info]] <- :ets.match(__MODULE__, {key, :"$1"}) do
{:ok, fee_info}
else
[] -> {:error, :not_found}
end
end
@spec all :: []
def all do
__MODULE__
|> :ets.select([{{:_, :_}, [], [:"$_"]}])
|> Enum.map(fn {{_, _, _}, fee_info} -> fee_info end)
end
@spec count :: number
def count do
all()
|> Enum.count()
end
defp create_ets_table do
:ets.new(__MODULE__, [:set, :protected, :named_table])
end
end