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