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