Packages

Type safe ranged integer operations for Gleam.

Current section

Files

Jump to
ranged_int src ranged_int@builtin@uint.erl
Raw

src/ranged_int@builtin@uint.erl

-module(ranged_int@builtin@uint).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-define(FILEPATH, "src/ranged_int/builtin/uint.gleam").
-export([to_bigint/1, from_bigint/1, compare/2, add/2, subtract/2, multiply/2, divide/2, modulo/2, remainder/2, power/2, eject/1]).
-export_type([uint/0]).
-if(?OTP_RELEASE >= 27).
-define(MODULEDOC(Str), -moduledoc(Str)).
-define(DOC(Str), -doc(Str)).
-else.
-define(MODULEDOC(Str), -compile([])).
-define(DOC(Str), -compile([])).
-endif.
?MODULEDOC(" An unsigned integer ranging from 0 and upwards.\n").
-opaque uint() :: {uint, bigi:big_int()}.
-file("src/ranged_int/builtin/uint.gleam", 22).
-spec to_bigint(uint()) -> bigi:big_int().
to_bigint(Uint) ->
erlang:element(2, Uint).
-file("src/ranged_int/builtin/uint.gleam", 68).
-spec from_bigint_unsafe(bigi:big_int()) -> uint().
from_bigint_unsafe(Value) ->
{uint, Value}.
-file("src/ranged_int/builtin/uint.gleam", 64).
-spec limits() -> ranged_int@interface:limits(ranged_int@interface:non_overflowable()).
limits() ->
ranged_int@interface:min_limit(bigi_ffi:from(0)).
-file("src/ranged_int/builtin/uint.gleam", 18).
-spec from_bigint(bigi:big_int()) -> {ok, uint()} |
{error, ranged_int@utils:overflow()}.
from_bigint(Value) ->
ranged_int@interface:from_bigint(
Value,
{interface, fun to_bigint/1, fun from_bigint_unsafe/1, fun limits/0}
).
-file("src/ranged_int/builtin/uint.gleam", 26).
-spec compare(uint(), uint()) -> gleam@order:order().
compare(A, B) ->
ranged_int@interface:compare(
A,
B,
{interface, fun to_bigint/1, fun from_bigint_unsafe/1, fun limits/0}
).
-file("src/ranged_int/builtin/uint.gleam", 30).
-spec add(uint(), bigi:big_int()) -> {ok, uint()} |
{error, ranged_int@utils:overflow()}.
add(A, B) ->
ranged_int@interface:math_op(
A,
B,
{interface, fun to_bigint/1, fun from_bigint_unsafe/1, fun limits/0},
fun bigi_ffi:add/2
).
-file("src/ranged_int/builtin/uint.gleam", 34).
-spec subtract(uint(), bigi:big_int()) -> {ok, uint()} |
{error, ranged_int@utils:overflow()}.
subtract(A, B) ->
ranged_int@interface:math_op(
A,
B,
{interface, fun to_bigint/1, fun from_bigint_unsafe/1, fun limits/0},
fun bigi_ffi:subtract/2
).
-file("src/ranged_int/builtin/uint.gleam", 38).
-spec multiply(uint(), bigi:big_int()) -> {ok, uint()} |
{error, ranged_int@utils:overflow()}.
multiply(A, B) ->
ranged_int@interface:math_op(
A,
B,
{interface, fun to_bigint/1, fun from_bigint_unsafe/1, fun limits/0},
fun bigi_ffi:multiply/2
).
-file("src/ranged_int/builtin/uint.gleam", 42).
-spec divide(uint(), bigi:big_int()) -> {ok, uint()} |
{error, ranged_int@utils:overflow()}.
divide(A, B) ->
ranged_int@interface:math_op(
A,
B,
{interface, fun to_bigint/1, fun from_bigint_unsafe/1, fun limits/0},
fun bigi_ffi:divide/2
).
-file("src/ranged_int/builtin/uint.gleam", 46).
-spec modulo(uint(), bigi:big_int()) -> {ok, uint()} |
{error, ranged_int@utils:overflow()}.
modulo(A, B) ->
ranged_int@interface:math_op(
A,
B,
{interface, fun to_bigint/1, fun from_bigint_unsafe/1, fun limits/0},
fun bigi_ffi:modulo/2
).
-file("src/ranged_int/builtin/uint.gleam", 50).
-spec remainder(uint(), bigi:big_int()) -> {ok, uint()} |
{error, ranged_int@utils:overflow()}.
remainder(A, B) ->
ranged_int@interface:math_op(
A,
B,
{interface, fun to_bigint/1, fun from_bigint_unsafe/1, fun limits/0},
fun bigi_ffi:remainder/2
).
-file("src/ranged_int/builtin/uint.gleam", 54).
-spec power(uint(), uint()) -> {ok, uint()} |
{error, ranged_int@utils:overflow()}.
power(A, B) ->
Result@1 = case ranged_int@interface:fallible_op(
A,
to_bigint(B),
{interface, fun to_bigint/1, fun from_bigint_unsafe/1, fun limits/0},
fun bigi_ffi:power/2
) of
{ok, Result} -> Result;
_assert_fail ->
erlang:error(#{gleam_error => let_assert,
message => <<"Pattern match failed, no pattern matched the value."/utf8>>,
file => <<?FILEPATH/utf8>>,
module => <<"ranged_int/builtin/uint"/utf8>>,
function => <<"power"/utf8>>,
line => 55,
value => _assert_fail,
start => 1108,
'end' => 1193,
pattern_start => 1119,
pattern_end => 1129})
end,
Result@1.
-file("src/ranged_int/builtin/uint.gleam", 60).
-spec eject({ok, uint()} | {error, ranged_int@utils:overflow()}) -> bigi:big_int().
eject(Op) ->
ranged_int@interface:eject(
Op,
{interface, fun to_bigint/1, fun from_bigint_unsafe/1, fun limits/0}
).