Current section
Files
Jump to
Current section
Files
src/m25@internal@bimap.erl
-module(m25@internal@bimap).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch]).
-define(FILEPATH, "src/m25/internal/bimap.gleam").
-export([new/0, get_by_key/2, get_by_value/2, delete_by_key/2, delete_by_value/2, insert/3, size/1, to_list/1]).
-export_type([bimap/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).
-opaque bimap(WXM, WXN) :: {bimap,
gleam@dict:dict(WXM, WXN),
gleam@dict:dict(WXN, WXM)}.
-file("src/m25/internal/bimap.gleam", 7).
?DOC(false).
-spec new() -> bimap(any(), any()).
new() ->
{bimap, maps:new(), maps:new()}.
-file("src/m25/internal/bimap.gleam", 56).
?DOC(false).
-spec get_by_key(bimap(WXY, WXZ), WXY) -> {ok, WXZ} | {error, nil}.
get_by_key(Bimap, Key) ->
gleam_stdlib:map_get(erlang:element(2, Bimap), Key).
-file("src/m25/internal/bimap.gleam", 60).
?DOC(false).
-spec get_by_value(bimap(WYE, WYF), WYF) -> {ok, WYE} | {error, nil}.
get_by_value(Bimap, Value) ->
gleam_stdlib:map_get(erlang:element(3, Bimap), Value).
-file("src/m25/internal/bimap.gleam", 64).
?DOC(false).
-spec delete_by_key(bimap(WYK, WYL), WYK) -> bimap(WYK, WYL).
delete_by_key(Bimap, Key) ->
case gleam_stdlib:map_get(erlang:element(2, Bimap), Key) of
{error, _} ->
Bimap;
{ok, Value} ->
From_key = gleam@dict:delete(erlang:element(2, Bimap), Key),
To_key = gleam@dict:delete(erlang:element(3, Bimap), Value),
{bimap, From_key, To_key}
end.
-file("src/m25/internal/bimap.gleam", 75).
?DOC(false).
-spec delete_by_value(bimap(WYQ, WYR), WYR) -> bimap(WYQ, WYR).
delete_by_value(Bimap, Value) ->
case gleam_stdlib:map_get(erlang:element(3, Bimap), Value) of
{error, _} ->
Bimap;
{ok, Key} ->
From_key = gleam@dict:delete(erlang:element(2, Bimap), Key),
To_key = gleam@dict:delete(erlang:element(3, Bimap), Value),
{bimap, From_key, To_key}
end.
-file("src/m25/internal/bimap.gleam", 11).
?DOC(false).
-spec insert(bimap(WXS, WXT), WXS, WXT) -> bimap(WXS, WXT).
insert(Bimap, Key, Value) ->
Key_exists = gleam@dict:has_key(erlang:element(2, Bimap), Key),
Value_exists = gleam@dict:has_key(erlang:element(3, Bimap), Value),
case {Key_exists, Value_exists} of
{true, true} ->
Cleaned = begin
_pipe = Bimap,
_pipe@1 = delete_by_key(_pipe, Key),
delete_by_value(_pipe@1, Value)
end,
{bimap,
gleam@dict:insert(erlang:element(2, Cleaned), Key, Value),
gleam@dict:insert(erlang:element(3, Cleaned), Value, Key)};
{true, false} ->
Cleaned@1 = delete_by_key(Bimap, Key),
{bimap,
gleam@dict:insert(erlang:element(2, Cleaned@1), Key, Value),
gleam@dict:insert(erlang:element(3, Cleaned@1), Value, Key)};
{false, true} ->
Cleaned@2 = delete_by_value(Bimap, Value),
{bimap,
gleam@dict:insert(erlang:element(2, Cleaned@2), Key, Value),
gleam@dict:insert(erlang:element(3, Cleaned@2), Value, Key)};
{false, false} ->
{bimap,
gleam@dict:insert(erlang:element(2, Bimap), Key, Value),
gleam@dict:insert(erlang:element(3, Bimap), Value, Key)}
end.
-file("src/m25/internal/bimap.gleam", 86).
?DOC(false).
-spec size(bimap(any(), any())) -> integer().
size(Bimap) ->
maps:size(erlang:element(2, Bimap)).
-file("src/m25/internal/bimap.gleam", 90).
?DOC(false).
-spec to_list(bimap(WZA, WZB)) -> list({WZA, WZB}).
to_list(Bimap) ->
maps:to_list(erlang:element(2, Bimap)).