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(FKC) :: empty | {heap, FKC, list(heap(FKC))}.
-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(FKH)) -> {ok, FKH} | {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(FKL), heap(FKL), fun((FKL, FKL) -> gleam@order:order())) -> heap(FKL).
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(FKP), FKP, fun((FKP, FKP) -> gleam@order:order())) -> heap(FKP).
insert(Heap, Value, Compare) ->
merge({heap, Value, []}, Heap, Compare).
-file("src/yog/internal/heap.gleam", 69).
?DOC(false).
-spec merge_pairs(list(heap(FKX)), fun((FKX, FKX) -> gleam@order:order())) -> heap(FKX).
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(FKS), fun((FKS, FKS) -> gleam@order:order())) -> {ok,
heap(FKS)} |
{error, nil}.
delete_min(Heap, Compare) ->
case Heap of
empty ->
{error, nil};
{heap, _, Subheaps} ->
{ok, merge_pairs(Subheaps, Compare)}
end.