Current section
Files
Jump to
Current section
Files
src/yog@internal@heap.erl
-module(yog@internal@heap).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/yog/internal/heap.gleam").
-export([new/0, is_empty/1, find_min/1, merge/3, insert/3, delete_min/2]).
-export_type([heap/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).
-type heap(GMD) :: empty | {heap, GMD, list(heap(GMD))}.
-file("src/yog/internal/heap.gleam", 13).
?DOC(false).
-spec new() -> heap(any()).
new() ->
empty.
-file("src/yog/internal/heap.gleam", 18).
?DOC(false).
-spec is_empty(heap(any())) -> boolean().
is_empty(Heap) ->
Heap =:= empty.
-file("src/yog/internal/heap.gleam", 25).
?DOC(false).
-spec find_min(heap(GMI)) -> {ok, GMI} | {error, nil}.
find_min(Heap) ->
case Heap of
empty ->
{error, nil};
{heap, V, _} ->
{ok, V}
end.
-file("src/yog/internal/heap.gleam", 36).
?DOC(false).
-spec merge(heap(GMM), heap(GMM), fun((GMM, GMM) -> gleam@order:order())) -> heap(GMM).
merge(H1, H2, Compare) ->
case {H1, H2} of
{empty, H} ->
H;
{H@1, empty} ->
H@1;
{{heap, V1, S1}, {heap, V2, S2}} ->
case Compare(V1, V2) of
lt ->
{heap, V1, [H2 | S1]};
eq ->
{heap, V1, [H2 | S1]};
gt ->
{heap, V2, [H1 | S2]}
end
end.
-file("src/yog/internal/heap.gleam", 51).
?DOC(false).
-spec insert(heap(GMQ), GMQ, fun((GMQ, GMQ) -> gleam@order:order())) -> heap(GMQ).
insert(Heap, Value, Compare) ->
merge({heap, Value, []}, Heap, Compare).
-file("src/yog/internal/heap.gleam", 69).
?DOC(false).
-spec merge_pairs(list(heap(GMY)), fun((GMY, GMY) -> gleam@order:order())) -> heap(GMY).
merge_pairs(Heaps, Compare) ->
case Heaps of
[] ->
empty;
[H] ->
H;
[H1, H2 | Rest] ->
merge(merge(H1, H2, Compare), merge_pairs(Rest, Compare), Compare)
end.
-file("src/yog/internal/heap.gleam", 59).
?DOC(false).
-spec delete_min(heap(GMT), fun((GMT, GMT) -> gleam@order:order())) -> {ok,
heap(GMT)} |
{error, nil}.
delete_min(Heap, Compare) ->
case Heap of
empty ->
{error, nil};
{heap, _, Subheaps} ->
{ok, merge_pairs(Subheaps, Compare)}
end.