Current section
Files
Jump to
Current section
Files
src/internal@search_container.erl
-module(internal@search_container).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/internal/search_container.gleam").
-export([new_stack/0, new_queue/0, new_lifo_heap/0, pop/1, push/2]).
-export_type([search_container/1]).
-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 search_container(GBS) :: {stack, list({integer(), GBS})} |
{queue, gleam@deque:deque({integer(), GBS})} |
{l_i_f_o_heap, balanced_tree:balanced_tree(integer(), list(GBS))}.
-file("src/internal/search_container.gleam", 13).
?DOC(false).
-spec new_stack() -> search_container(any()).
new_stack() ->
{stack, []}.
-file("src/internal/search_container.gleam", 17).
?DOC(false).
-spec new_queue() -> search_container(any()).
new_queue() ->
{queue, gleam@deque:new()}.
-file("src/internal/search_container.gleam", 21).
?DOC(false).
-spec new_lifo_heap() -> search_container(any()).
new_lifo_heap() ->
{l_i_f_o_heap, gb_trees:empty()}.
-file("src/internal/search_container.gleam", 25).
?DOC(false).
-spec pop(search_container(GBW)) -> {ok,
{{integer(), GBW}, search_container(GBW)}} |
{error, nil}.
pop(Sc) ->
case Sc of
{stack, List} ->
case List of
[Head | Tail] ->
{ok, {Head, {stack, Tail}}};
[] ->
{error, nil}
end;
{queue, Deque} ->
_pipe = Deque,
_pipe@1 = gleam@deque:pop_front(_pipe),
gleam@result:map(
_pipe@1,
fun(Tuple) ->
{erlang:element(1, Tuple),
{queue, erlang:element(2, Tuple)}}
end
);
{l_i_f_o_heap, Tree} ->
_pipe@2 = Tree,
_pipe@3 = balanced_tree:get_min(_pipe@2),
gleam@result:'try'(_pipe@3, fun(State) -> case State of
{Cost, [Head@1]} ->
Next_heap = begin
_pipe@4 = Tree,
_pipe@5 = balanced_tree:delete(_pipe@4, Cost),
{l_i_f_o_heap, _pipe@5}
end,
{ok, {{Cost, Head@1}, Next_heap}};
{Cost@1, [Head@2 | Tail@1]} ->
Next_heap@1 = begin
_pipe@6 = Tree,
_pipe@7 = balanced_tree:insert(
_pipe@6,
Cost@1,
Tail@1
),
{l_i_f_o_heap, _pipe@7}
end,
{ok, {{Cost@1, Head@2}, Next_heap@1}};
{Cost@2, []} ->
Next_heap@2 = begin
_pipe@8 = Tree,
_pipe@9 = balanced_tree:delete(_pipe@8, Cost@2),
{l_i_f_o_heap, _pipe@9}
end,
pop(Next_heap@2)
end end)
end.
-file("src/internal/search_container.gleam", 67).
?DOC(false).
-spec push(search_container(GCB), {integer(), GCB}) -> search_container(GCB).
push(Container, Cost_value_pair) ->
{Cost, Value} = Cost_value_pair,
case Container of
{stack, List} ->
_pipe = gleam@list:prepend(List, Cost_value_pair),
{stack, _pipe};
{queue, Queue} ->
_pipe@1 = gleam@deque:push_back(Queue, Cost_value_pair),
{queue, _pipe@1};
{l_i_f_o_heap, Tree} ->
Handler = fun(Opt) -> case Opt of
{some, List@1} ->
[Value | List@1];
none ->
[Value]
end end,
_pipe@2 = balanced_tree:upsert(Tree, Cost, Handler),
{l_i_f_o_heap, _pipe@2}
end.