-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(EFE) :: {heap, heap_repr(EFE), fun((EFE, EFE) -> gleam@order:order())}. -type heap_repr(EFF) :: empty | {cons, EFF, list(heap_repr(EFF))}. -file("src/graph/internal/heap.gleam", 12). ?DOC(false). -spec new(fun((EFG, EFG) -> gleam@order:order())) -> heap(EFG). new(Compare) -> {heap, empty, Compare}. -file("src/graph/internal/heap.gleam", 32). ?DOC(false). -spec min(heap(EFQ)) -> {ok, EFQ} | {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(EFU), heap_repr(EFU), fun((EFU, EFU) -> gleam@order:order()) ) -> heap_repr(EFU). 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(EFI), EFI) -> heap(EFI). 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(EFY)), fun((EFY, EFY) -> gleam@order:order())) -> heap_repr(EFY). 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(EFL)) -> {ok, {EFL, heap(EFL)}} | {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.