Packages
tai
0.0.13
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/markets/asset.ex
defmodule Tai.Markets.Asset do
@moduledoc """
Arbitratry precision arithmetic for assets
"""
alias Tai.Markets.Asset
@enforce_keys [:val, :symbol]
defstruct [:val, :symbol]
def new(val, symbol) do
%Asset{val: val |> to_decimal(), symbol: symbol}
end
def add(%Asset{} = a, %Asset{} = b) do
if a.symbol === b.symbol do
new_val = Decimal.add(a.val, b.val)
%Asset{val: new_val, symbol: a.symbol}
else
raise ArithmeticError, "can't add assets with different symbols: #{a.symbol}, #{b.symbol}"
end
end
def sub(%Asset{} = a, %Asset{} = b) do
if a.symbol === b.symbol do
new_val = Decimal.sub(a.val, b.val)
%Asset{val: new_val, symbol: a.symbol}
else
raise ArithmeticError,
"can't subtract assets with different symbols: #{a.symbol}, #{b.symbol}"
end
end
@zero Decimal.new(0)
def zero?(%Asset{val: val}), do: val |> Decimal.cmp(@zero) == :eq
defp to_decimal(val) when is_float(val), do: val |> Decimal.from_float()
defp to_decimal(val), do: val |> Decimal.new()
end
defimpl String.Chars, for: Tai.Markets.Asset do
alias Tai.Markets.Asset
def to_string(%Asset{val: val, symbol: symbol}) do
p = precision(symbol)
val
|> Decimal.round(p)
|> Decimal.to_string(:normal)
end
@default_precision 8
@precision %{
eth: 18,
usd: 2
}
defp precision(symbol) do
@precision
|> Map.get(symbol, @default_precision)
end
end