-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.