Current section
Files
Jump to
Current section
Files
src/themis@number.erl
-module(themis@number).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([int/1, dec/1, pos_inf/0, neg_inf/0, nan/0, compare/2, add/2]).
-export_type([comparison_error/0]).
-type comparison_error() :: na_n_value.
-file("/git/Themis/src/themis/number.gleam", 11).
-spec int(integer()) -> internal@prometheus:number_().
int(Value) ->
{int, Value}.
-file("/git/Themis/src/themis/number.gleam", 16).
-spec dec(float()) -> internal@prometheus:number_().
dec(Value) ->
{dec, Value}.
-file("/git/Themis/src/themis/number.gleam", 21).
-spec pos_inf() -> internal@prometheus:number_().
pos_inf() ->
pos_inf.
-file("/git/Themis/src/themis/number.gleam", 26).
-spec neg_inf() -> internal@prometheus:number_().
neg_inf() ->
neg_inf.
-file("/git/Themis/src/themis/number.gleam", 31).
-spec nan() -> internal@prometheus:number_().
nan() ->
na_n.
-file("/git/Themis/src/themis/number.gleam", 37).
-spec compare(internal@prometheus:number_(), internal@prometheus:number_()) -> {ok,
gleam@order:order()} |
{error, comparison_error()}.
compare(Val1, Val2) ->
case {Val1, Val2} of
{V1, V2} when V1 =:= V2 ->
{ok, eq};
{{int, V1@1}, {int, V2@1}} ->
{ok, gleam@int:compare(V1@1, V2@1)};
{{dec, V1@2}, {dec, V2@2}} ->
{ok, gleam@float:compare(V1@2, V2@2)};
{pos_inf, _} ->
{ok, gt};
{neg_inf, _} ->
{ok, lt};
{_, pos_inf} ->
{ok, lt};
{_, neg_inf} ->
{ok, gt};
{{dec, D}, {int, I}} ->
{ok, gleam@float:compare(D, erlang:float(I))};
{{int, I@1}, {dec, D@1}} ->
{ok, gleam@float:compare(erlang:float(I@1), D@1)};
{na_n, _} ->
{error, na_n_value};
{_, na_n} ->
{error, na_n_value}
end.
-file("/git/Themis/src/themis/number.gleam", 55).
-spec add(internal@prometheus:number_(), internal@prometheus:number_()) -> internal@prometheus:number_().
add(Val1, Val2) ->
case {Val1, Val2} of
{na_n, _} ->
na_n;
{_, na_n} ->
na_n;
{{int, First}, {int, Second}} ->
{int, First + Second};
{{dec, First@1}, {dec, Second@1}} ->
{dec, gleam@float:add(First@1, Second@1)};
{{dec, Dec}, {int, Int}} ->
{dec, gleam@float:add(erlang:float(Int), Dec)};
{{int, Int}, {dec, Dec}} ->
{dec, gleam@float:add(erlang:float(Int), Dec)};
{pos_inf, neg_inf} ->
na_n;
{neg_inf, pos_inf} ->
na_n;
{pos_inf, _} ->
pos_inf;
{_, pos_inf} ->
pos_inf;
{neg_inf, _} ->
neg_inf;
{_, neg_inf} ->
neg_inf
end.