-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, print/1]). -export_type([comparison_error/0, number_/0]). -type comparison_error() :: na_n_value. -type number_() :: pos_inf | neg_inf | na_n | {dec, float()} | {int, integer()}. -file("/git/Themis/src/themis/number.gleam", 21). -spec int(integer()) -> number_(). int(Value) -> {int, Value}. -file("/git/Themis/src/themis/number.gleam", 26). -spec dec(float()) -> number_(). dec(Value) -> {dec, Value}. -file("/git/Themis/src/themis/number.gleam", 31). -spec pos_inf() -> number_(). pos_inf() -> pos_inf. -file("/git/Themis/src/themis/number.gleam", 36). -spec neg_inf() -> number_(). neg_inf() -> neg_inf. -file("/git/Themis/src/themis/number.gleam", 41). -spec nan() -> number_(). nan() -> na_n. -file("/git/Themis/src/themis/number.gleam", 47). -spec compare(number_(), 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", 68). -spec add(number_(), number_()) -> 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. -file("/git/Themis/src/themis/number.gleam", 82). -spec print(number_()) -> binary(). print(Number) -> case Number of {dec, Val} -> gleam_stdlib:float_to_string(Val); {int, Val@1} -> erlang:integer_to_binary(Val@1); na_n -> <<"NaN"/utf8>>; neg_inf -> <<"-Inf"/utf8>>; pos_inf -> <<"+Inf"/utf8>> end.