Current section

Files

Jump to
gxid src gxid.erl
Raw

src/gxid.erl

-module(gxid).
-compile(no_auto_import).
-export([start/0, generate/1]).
-export_type([message/0, state/0, char_list/0]).
-opaque message() :: {generate, gleam@erlang@process:subject(binary())}.
-opaque state() :: {state, integer(), integer(), integer()}.
-type char_list() :: any().
-spec start() -> {ok, gleam@erlang@process:subject(message())} |
{error, gleam@otp@actor:start_error()}.
start() ->
gleam@otp@actor:start(
{state, gleam@int:random(0, 16777215), get_int_pid(), get_machine_id()},
fun handle/2
).
-spec generate(gleam@erlang@process:subject(message())) -> binary().
generate(Channel) ->
gleam@otp@actor:call(Channel, fun(A) -> {generate, A} end, 1000).
-spec handle(message(), state()) -> gleam@otp@actor:next(state()).
handle(Msg, State) ->
case Msg of
{generate, Reply} ->
Id = format_id(
[format_time(os:system_time(millisecond)),
format_machine_id(erlang:element(4, State)),
format_pid(erlang:element(3, State)),
format_random_number(erlang:element(2, State))]
),
gleam@otp@actor:send(Reply, Id),
{continue,
erlang:setelement(2, State, erlang:element(2, State) + 1)}
end.
-spec format_time(integer()) -> bitstring().
format_time(Time) ->
<<Time:32/big>>.
-spec format_machine_id(integer()) -> bitstring().
format_machine_id(Mid) ->
<<Mid:24/big>>.
-spec format_pid(integer()) -> bitstring().
format_pid(Pid) ->
<<Pid:16/big>>.
-spec format_random_number(integer()) -> bitstring().
format_random_number(Random_number) ->
<<(gleam@bitwise:shift_left(Random_number, 8)):24>>.
-spec format_id(list(bitstring())) -> binary().
format_id(Id_data) ->
encode(
begin
_pipe = Id_data,
gleam@bit_string:concat(_pipe)
end
).
-spec get_int_pid() -> integer().
get_int_pid() ->
{ok, Pid@1} = case begin
_pipe = os:getpid(),
_pipe@1 = erlang:list_to_binary(_pipe),
gleam@int:parse(_pipe@1)
end of
{ok, Pid} -> {ok, Pid};
_try ->
erlang:error(#{gleam_error => assert,
message => <<"Assertion pattern match failed"/utf8>>,
value => _try,
module => <<"gxid"/utf8>>,
function => <<"get_int_pid"/utf8>>,
line => 90})
end,
Pid@1.
-spec get_machine_id() -> integer().
get_machine_id() ->
Localhost = net_adm:localhost(),
_pipe = Localhost,
gleam@list:fold(_pipe, 0, fun(Char, Acc) -> Char + Acc end).
-spec encode(bitstring()) -> binary().
encode(Bit_xid) ->
<<B0:8, B1:8, B2:8, B3:8, B4:8, B5:8, B6:8, B7:8, B8:8, B9:8, B10:8, B11:8>> = <<Bit_xid/bitstring>>,
Rez = [encode_hex(gleam@bitwise:shift_right(B0, 8)),
encode_hex(
gleam@bitwise:'or'(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B1, 6), 16#1F),
gleam@bitwise:'and'(gleam@bitwise:shift_left(B0, 2), 16#1F)
)
),
encode_hex(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B1, 1), 16#1F)
),
encode_hex(
gleam@bitwise:'or'(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B2, 4), 16#1F),
gleam@bitwise:'and'(gleam@bitwise:shift_left(B1, 4), 16#1F)
)
),
encode_hex(
gleam@bitwise:'or'(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B3, 7), 16#1F),
gleam@bitwise:'and'(gleam@bitwise:shift_left(B2, 1), 16#1F)
)
),
encode_hex(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B3, 2), 16#1F)
),
encode_hex(
gleam@bitwise:'or'(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B4, 5), 16#1F),
gleam@bitwise:'and'(gleam@bitwise:shift_left(B3, 3), 16#1F)
)
),
encode_hex(gleam@bitwise:'and'(B4, 16#1F)),
encode_hex(gleam@bitwise:shift_right(B5, 3)),
encode_hex(
gleam@bitwise:'or'(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B6, 6), 16#1F),
gleam@bitwise:'and'(gleam@bitwise:shift_left(B5, 2), 16#1F)
)
),
encode_hex(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B6, 1), 16#1F)
),
encode_hex(
gleam@bitwise:'or'(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B7, 4), 16#1F),
gleam@bitwise:'and'(gleam@bitwise:shift_left(B6, 4), 16#1F)
)
),
encode_hex(
gleam@bitwise:'or'(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B8, 7), 16#1F),
gleam@bitwise:'and'(gleam@bitwise:shift_left(B7, 1), 16#1F)
)
),
encode_hex(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B8, 2), 16#1F)
),
encode_hex(
gleam@bitwise:'or'(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B9, 5), 16#1F),
gleam@bitwise:'and'(gleam@bitwise:shift_left(B8, 3), 16#1F)
)
),
encode_hex(gleam@bitwise:'and'(B9, 16#1F)),
encode_hex(gleam@bitwise:shift_right(B10, 3)),
encode_hex(
gleam@bitwise:'or'(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B11, 6), 16#1F),
gleam@bitwise:'and'(gleam@bitwise:shift_left(B10, 2), 16#1F)
)
),
encode_hex(
gleam@bitwise:'and'(gleam@bitwise:shift_right(B11, 1), 16#1F)
),
encode_hex(
gleam@bitwise:'and'(gleam@bitwise:shift_left(B11, 4), 16#1F)
)],
gleam@string:join(Rez, <<""/utf8>>).
-spec encode_hex(integer()) -> binary().
encode_hex(I) ->
case I of
0 ->
<<"0"/utf8>>;
1 ->
<<"1"/utf8>>;
2 ->
<<"2"/utf8>>;
3 ->
<<"3"/utf8>>;
4 ->
<<"4"/utf8>>;
5 ->
<<"5"/utf8>>;
6 ->
<<"6"/utf8>>;
7 ->
<<"7"/utf8>>;
8 ->
<<"8"/utf8>>;
9 ->
<<"9"/utf8>>;
10 ->
<<"a"/utf8>>;
11 ->
<<"b"/utf8>>;
12 ->
<<"c"/utf8>>;
13 ->
<<"d"/utf8>>;
14 ->
<<"e"/utf8>>;
15 ->
<<"f"/utf8>>;
16 ->
<<"g"/utf8>>;
17 ->
<<"h"/utf8>>;
18 ->
<<"i"/utf8>>;
19 ->
<<"j"/utf8>>;
20 ->
<<"k"/utf8>>;
21 ->
<<"l"/utf8>>;
22 ->
<<"m"/utf8>>;
23 ->
<<"n"/utf8>>;
24 ->
<<"o"/utf8>>;
25 ->
<<"p"/utf8>>;
26 ->
<<"q"/utf8>>;
27 ->
<<"r"/utf8>>;
28 ->
<<"s"/utf8>>;
29 ->
<<"t"/utf8>>;
30 ->
<<"u"/utf8>>;
31 ->
<<"v"/utf8>>
end.