5 | interface PriorityQueue (queue : Type -> Type) where
7 | empty : {auto o : Ord e} -> queue e
9 | singleton : {auto o : Ord e} -> (element : e) -> queue e
11 | isNull : queue e -> Bool
13 | length : queue e -> Nat
15 | findMin : queue e -> Maybe e
17 | meld : (x, y : queue e) -> queue e
19 | insert : (element : e) -> queue e -> queue e
22 | deleteMin : queue e -> queue e
24 | fromFoldable : Ord e => Foldable m => (xs : m e) -> queue e
26 | foldl (flip insert) empty xs
28 | queueFoldl : (f : acc -> e -> acc) -> (init : acc) -> queue e -> acc
29 | queueFoldl f acc queue =
30 | case findMin queue of
33 | queueFoldl f (f acc val) (assert_smaller queue (deleteMin queue))
36 | {q : _} -> PriorityQueue q => Foldable q where
39 | foldr f acc queue = foldr f acc (reverse $
queueFoldl (flip (::)) [] queue)
42 | toList queue = reverse $
queueFoldl (flip (::)) [] queue