{-# 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)