Current section

Files

Jump to
glanoid src glanoid.erl
Raw

src/glanoid.erl

-module(glanoid).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-export([make_generator/1]).
-spec do_bit_size(integer(), integer()) -> integer().
do_bit_size(N, Acc) ->
case N of
0 ->
Acc;
_ ->
do_bit_size(erlang:'bsr'(N, 1), Acc + 1)
end.
-spec bit_size(integer()) -> integer().
bit_size(N) ->
do_bit_size(N, 0).
-spec make_generator(binary()) -> fun((integer()) -> binary()).
make_generator(Alphabet) ->
Bit_mask = begin
_pipe = Alphabet,
_pipe@1 = gleam@string:length(_pipe),
_pipe@2 = bit_size(_pipe@1),
_pipe@3 = gleam@int:subtract(_pipe@2, 1),
_pipe@4 = erlang:'bsl'(1, _pipe@3),
gleam@int:subtract(_pipe@4, 1)
end,
To_alphabet@1 = funtil:fix3(
fun(To_alphabet, Bits, Alphabet@1, Acc) -> case Bits of
<<X:8, Rest/bitstring>> ->
Index = erlang:'band'(X, Bit_mask),
Letter = gleam@string:slice(Alphabet@1, Index, 1),
case Letter of
<<""/utf8>> ->
To_alphabet(Bits, Alphabet@1, Acc);
_ ->
To_alphabet(
Rest,
Alphabet@1,
<<Acc/binary, Letter/binary>>
)
end;
<<>> ->
Acc;
_ ->
erlang:error(#{gleam_error => panic,
message => <<"panic expression evaluated"/utf8>>,
module => <<"glanoid"/utf8>>,
function => <<"make_generator"/utf8>>,
line => 42})
end end
),
fun(Size) -> _pipe@5 = crypto:strong_rand_bytes(Size),
To_alphabet@1(_pipe@5, Alphabet, <<""/utf8>>) end.