Current section
Files
Jump to
Current section
Files
src/graph@internal@heap.erl
-module(graph@internal@heap).
-compile([no_auto_import, nowarn_unused_vars, nowarn_unused_function, nowarn_nomatch, inline]).
-define(FILEPATH, "src/graph/internal/heap.gleam").
-export([new/1, min/1, add/2, pop_min/1]).
-export_type([heap/1, heap_repr/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 heap(ELA) :: {heap,
heap_repr(ELA),
fun((ELA, ELA) -> gleam@order:order())}.
-type heap_repr(ELB) :: empty | {cons, ELB, list(heap_repr(ELB))}.
-file("src/graph/internal/heap.gleam", 12).
?DOC(false).
-spec new(fun((ELC, ELC) -> gleam@order:order())) -> heap(ELC).
new(Compare) ->
{heap, empty, Compare}.
-file("src/graph/internal/heap.gleam", 32).
?DOC(false).
-spec min(heap(ELM)) -> {ok, ELM} | {error, nil}.
min(Heap) ->
case Heap of
{heap, empty, _} ->
{error, nil};
{heap, {cons, Min, _}, _} ->
{ok, Min}
end.
-file("src/graph/internal/heap.gleam", 39).
?DOC(false).
-spec merge(
heap_repr(ELQ),
heap_repr(ELQ),
fun((ELQ, ELQ) -> gleam@order:order())
) -> heap_repr(ELQ).
merge(One, Other, Compare) ->
case {One, Other} of
{empty, Res} ->
Res;
{Res, empty} ->
Res;
{{cons, Min_one, Rest_one}, {cons, Min_other, Rest_other}} ->
case Compare(Min_one, Min_other) of
lt ->
{cons, Min_one, [Other | Rest_one]};
eq ->
{cons, Min_one, [Other | Rest_one]};
gt ->
{cons, Min_other, [One | Rest_other]}
end
end.
-file("src/graph/internal/heap.gleam", 16).
?DOC(false).
-spec add(heap(ELE), ELE) -> heap(ELE).
add(Heap, Item) ->
{heap, Heap@1, Compare} = Heap,
Heap@2 = merge(Heap@1, {cons, Item, []}, Compare),
{heap, Heap@2, Compare}.
-file("src/graph/internal/heap.gleam", 54).
?DOC(false).
-spec merge_all(list(heap_repr(ELU)), fun((ELU, ELU) -> gleam@order:order())) -> heap_repr(ELU).
merge_all(Heaps, Compare) ->
case Heaps of
[] ->
empty;
[Heap] ->
Heap;
[One_heap, Other_heap | Heaps@1] ->
_pipe = merge(One_heap, Other_heap, Compare),
merge(_pipe, merge_all(Heaps@1, Compare), Compare)
end.
-file("src/graph/internal/heap.gleam", 22).
?DOC(false).
-spec pop_min(heap(ELH)) -> {ok, {ELH, heap(ELH)}} | {error, nil}.
pop_min(Heap) ->
case Heap of
{heap, empty, _} ->
{error, nil};
{heap, {cons, Min, Rest}, Compare} ->
Remaining = merge_all(Rest, Compare),
{ok, {Min, {heap, Remaining, Compare}}}
end.