Current section
Files
Jump to
Current section
Files
src/telega@internal@flow_storage.erl
-module(telega@internal@flow_storage).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/telega/internal/flow_storage.gleam").
-export([start/0, save/3, load/2, delete/2, add_to_index/3, remove_from_index/3, lookup_index/2]).
-export_type([ets_table/0, flow_ets_storage/0]).
-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).
-type ets_table() :: any().
-opaque flow_ets_storage() :: {flow_ets_storage, ets_table()}.
-file("src/telega/internal/flow_storage.gleam", 102).
?DOC(false).
-spec is_undefined(gleam@dynamic:dynamic_()) -> boolean().
is_undefined(Value) ->
case gleam_erlang_ffi:atom_from_string(<<"undefined"/utf8>>) of
{ok, Undefined} ->
Value =:= gleam_erlang_ffi:identity(Undefined);
{error, _} ->
false
end.
-file("src/telega/internal/flow_storage.gleam", 14).
?DOC(false).
-spec start() -> {ok, flow_ets_storage()} | {error, telega@error:telega_error()}.
start() ->
Name = erlang:binary_to_atom(<<"telega_flow_storage"/utf8>>),
Table = case is_undefined(ets:whereis(Name)) of
true ->
ets:new(
Name,
[erlang:binary_to_atom(<<"set"/utf8>>),
erlang:binary_to_atom(<<"public"/utf8>>),
erlang:binary_to_atom(<<"named_table"/utf8>>)]
);
false ->
gleam_stdlib:identity(ets:whereis(Name))
end,
{ok, {flow_ets_storage, Table}}.
-file("src/telega/internal/flow_storage.gleam", 28).
?DOC(false).
-spec save(flow_ets_storage(), binary(), any()) -> nil.
save(Storage, Key, Value) ->
ets:insert(erlang:element(2, Storage), {Key, Value}),
nil.
-file("src/telega/internal/flow_storage.gleam", 33).
?DOC(false).
-spec load(flow_ets_storage(), binary()) -> gleam@option:option(any()).
load(Storage, Key) ->
case ets:lookup(erlang:element(2, Storage), Key) of
[] ->
none;
[{_, Value} | _] ->
{some, Value}
end.
-file("src/telega/internal/flow_storage.gleam", 40).
?DOC(false).
-spec delete(flow_ets_storage(), binary()) -> nil.
delete(Storage, Key) ->
ets:delete(erlang:element(2, Storage), Key),
nil.
-file("src/telega/internal/flow_storage.gleam", 46).
?DOC(false).
-spec add_to_index(flow_ets_storage(), binary(), binary()) -> nil.
add_to_index(Storage, Index_key, Instance_id) ->
Existing = case ets:lookup(erlang:element(2, Storage), Index_key) of
[] ->
[];
[{_, Ids} | _] ->
Ids
end,
case gleam@list:contains(Existing, Instance_id) of
true ->
nil;
false ->
ets:insert(
erlang:element(2, Storage),
{Index_key, [Instance_id | Existing]}
),
nil
end.
-file("src/telega/internal/flow_storage.gleam", 65).
?DOC(false).
-spec remove_from_index(flow_ets_storage(), binary(), binary()) -> nil.
remove_from_index(Storage, Index_key, Instance_id) ->
case ets:lookup(erlang:element(2, Storage), Index_key) of
[] ->
nil;
[{_, Ids} | _] ->
Updated = gleam@list:filter(Ids, fun(Id) -> Id /= Instance_id end),
case Updated of
[] ->
ets:delete(erlang:element(2, Storage), Index_key),
nil;
_ ->
ets:insert(erlang:element(2, Storage), {Index_key, Updated}),
nil
end
end.
-file("src/telega/internal/flow_storage.gleam", 89).
?DOC(false).
-spec lookup_index(flow_ets_storage(), binary()) -> list(binary()).
lookup_index(Storage, Index_key) ->
case ets:lookup(erlang:element(2, Storage), Index_key) of
[] ->
[];
[{_, Ids} | _] ->
Ids
end.