{-# OPTIONS --cubical --safe #-} open import Algebra open import Relation.Binary open import Algebra.Monus open import Level module Data.MonoidalHeap.Monad {s} {๐ : Type s} (monus : TMAPOM ๐) where open TMAPOM monus open import Prelude open import Data.List using (List; _โท_; []; foldr; _++_) import Data.Nat as โ import Data.Nat.Properties as โ ๐ฎ : Type s ๐ฎ = ๐ โ ๐ โฆ_โโง : ๐ โ ๐ฎ โฆ_โโง = _โ_ โฆ_โโง : ๐ฎ โ ๐ โฆ x โโง = x ฮต infixl 10 _โ_ _โ_ : (๐ โ A) โ ๐ โ ๐ โ A f โ x = ฮป y โ f (x โ y) mutual data Node (V : ๐ โ Type a) : Type (a โโ s) where leaf : V ฮต โ Node V _โ_ : (w : ๐) โ Heap (V โ w) โ Node V Heap : (๐ โ Type a) โ Type (a โโ s) Heap V = List (Node V) private variable v : Level V : ๐ โ Type v Root : (๐ โ Type v) โ Type _ Root V = โ w ร Heap (V โ w) partition : Heap V โ List (V ฮต) ร List (Root V) partition = foldr f ([] , []) where f : Node V โ List (V ฮต) ร List (โ w ร Heap (V โ w)) โ List (V ฮต) ร List (โ w ร Heap (V โ w)) f (leaf x) (ls , hs) = (x โท ls) , hs f (w โ x) (ls , hs) = ls , ((w , x) โท hs) module _ {V : ๐ โ Type v} where โ-assoc : โ x y k โ x โก y โ k โ V โ x โก V โ y โ k โ-assoc x y k xโกyโk i z = V ((cong (_โ z) xโกyโk อพ assoc y k z) i) โฮต : V โ ฮต โก V โฮต i x = V (ฮตโ x i) โ-rassoc : โ x y โ V โ (x โ y) โก V โ x โ y โ-rassoc x y i z = V (assoc x y z i) merge : Root V โ Root V โ Root V merge (x , xs) (y , ys) with x โค|โฅ y ... | inl (k , yโกxโk) = x , (k โ subst Heap (โ-assoc y x k yโกxโk) ys) โท xs ... | inr (k , xโกyโk) = y , (k โ subst Heap (โ-assoc x y k xโกyโk) xs) โท ys mergesโบ : Root V โ List (Root V) โ Root V mergesโบ x [] = x mergesโบ xโ (xโ โท []) = merge xโ xโ mergesโบ xโ (xโ โท xโ โท xs) = merge (merge xโ xโ) (mergesโบ xโ xs) merges : List (Root V) โ Maybe (Root V) merges [] = nothing merges (x โท xs) = just (mergesโบ x xs) popMin : Heap V โ List (V ฮต) ร Maybe (Root V) popMin = mapโ merges โ partition return : V ฮต โ Heap V return x = leaf x โท [] weight : โ x ร V x โ Heap V weight (w , x) = (w โ (leaf (subst V (sym (โฮต w)) x) โท [])) โท [] _>>=_ : Heap V โ (โ {x} โ V x โ Heap (V โ x)) โ Heap V _>>=_ [] k = [] _>>=_ (leaf x โท xs) k = subst Heap โฮต (k x) ++ (xs >>= k) _>>=_ {V = V} ((w โ x) โท xs) k = (w โ (x >>= (subst Heap (โ-rassoc {V = V} w _) โ k))) โท (xs >>= k)