Current section
Files
Jump to
Current section
Files
src/kdleam@bignum.erl
-module(kdleam@bignum).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/kdleam/bignum.gleam").
-export([base_to_decimal/2]).
-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(false).
-file("src/kdleam/bignum.gleam", 77).
?DOC(false).
-spec mul_add_loop(list(integer()), integer(), integer(), list(integer())) -> list(integer()).
mul_add_loop(Digits, Factor, Carry, Acc) ->
case Digits of
[] ->
case Carry of
0 ->
lists:reverse(Acc);
_ ->
mul_add_loop([], Factor, Carry div 10, [Carry rem 10 | Acc])
end;
[D | Rest] ->
Value = (D * Factor) + Carry,
Digit = Value rem 10,
Next_carry = Value div 10,
mul_add_loop(Rest, Factor, Next_carry, [Digit | Acc])
end.
-file("src/kdleam/bignum.gleam", 73).
?DOC(false).
-spec mul_add(list(integer()), integer(), integer()) -> list(integer()).
mul_add(Digits, Factor, Addend) ->
mul_add_loop(Digits, Factor, Addend, []).
-file("src/kdleam/bignum.gleam", 98).
?DOC(false).
-spec strip_leading_zeros(list(integer())) -> list(integer()).
strip_leading_zeros(Digits) ->
case Digits of
[0, Next | Rest] ->
strip_leading_zeros([Next | Rest]);
_ ->
Digits
end.
-file("src/kdleam/bignum.gleam", 62).
?DOC(false).
-spec convert_loop(list(integer()), integer(), list(integer())) -> list(integer()).
convert_loop(Source_digits, Source_base, Acc) ->
case Source_digits of
[] ->
strip_leading_zeros(lists:reverse(Acc));
[D | Rest] ->
convert_loop(Rest, Source_base, mul_add(Acc, Source_base, D))
end.
-file("src/kdleam/bignum.gleam", 58).
?DOC(false).
-spec convert(list(integer()), integer()) -> list(integer()).
convert(Source_digits, Source_base) ->
convert_loop(Source_digits, Source_base, [0]).
-file("src/kdleam/bignum.gleam", 105).
?DOC(false).
-spec digits_to_string(list(integer())) -> binary().
digits_to_string(Digits) ->
case Digits of
[] ->
<<"0"/utf8>>;
_ ->
_pipe = Digits,
_pipe@1 = gleam@list:map(_pipe, fun erlang:integer_to_binary/1),
gleam@string:join(_pipe@1, <<""/utf8>>)
end.
-file("src/kdleam/bignum.gleam", 36).
?DOC(false).
-spec digit_value(binary()) -> {ok, integer()} | {error, nil}.
digit_value(G) ->
case G of
<<"0"/utf8>> ->
{ok, 0};
<<"1"/utf8>> ->
{ok, 1};
<<"2"/utf8>> ->
{ok, 2};
<<"3"/utf8>> ->
{ok, 3};
<<"4"/utf8>> ->
{ok, 4};
<<"5"/utf8>> ->
{ok, 5};
<<"6"/utf8>> ->
{ok, 6};
<<"7"/utf8>> ->
{ok, 7};
<<"8"/utf8>> ->
{ok, 8};
<<"9"/utf8>> ->
{ok, 9};
<<"a"/utf8>> ->
{ok, 10};
<<"A"/utf8>> ->
{ok, 10};
<<"b"/utf8>> ->
{ok, 11};
<<"B"/utf8>> ->
{ok, 11};
<<"c"/utf8>> ->
{ok, 12};
<<"C"/utf8>> ->
{ok, 12};
<<"d"/utf8>> ->
{ok, 13};
<<"D"/utf8>> ->
{ok, 13};
<<"e"/utf8>> ->
{ok, 14};
<<"E"/utf8>> ->
{ok, 14};
<<"f"/utf8>> ->
{ok, 15};
<<"F"/utf8>> ->
{ok, 15};
_ ->
{error, nil}
end.
-file("src/kdleam/bignum.gleam", 17).
?DOC(false).
-spec decode_digits(list(binary()), integer(), list(integer())) -> {ok,
list(integer())} |
{error, nil}.
decode_digits(Graphemes, Base, Acc) ->
case Graphemes of
[] ->
{ok, lists:reverse(Acc)};
[G | Rest] ->
case digit_value(G) of
{error, _} ->
{error, nil};
{ok, V} ->
case V < Base of
false ->
{error, nil};
true ->
decode_digits(Rest, Base, [V | Acc])
end
end
end.
-file("src/kdleam/bignum.gleam", 6).
?DOC(false).
-spec base_to_decimal(binary(), integer()) -> {ok, binary()} | {error, nil}.
base_to_decimal(Digits, Base) ->
case gleam@string:to_graphemes(Digits) of
[] ->
{error, nil};
Graphemes ->
case decode_digits(Graphemes, Base, []) of
{error, _} ->
{error, nil};
{ok, Values} ->
{ok, digits_to_string(convert(Values, Base))}
end
end.