{-# OPTIONS --cubical --no-positivity-check --no-termination-check #-} open import Prelude open import Algebra open import Algebra.Monus open import Relation.Binary open import Data.Maybe open import Data.List using (List; _β·_; []; foldr) module Control.Monad.HeapT.NonTransformer {β} {π : Type β} (monoid : Monoid π) where open Monoid monoid private variable w : π infixr 5 _β·_ infixr 6 _β_ mutual record Root (A : Type β) : Type β where coinductive constructor _β_ field weight : π step : Branch A data Node (A : Type β) : Type β where β_β : A β Node A β_β : Root A β Node A data Branch (A : Type β) : Type β where [] : Branch A _β·_ : Node A β Branch A β Branch A open Root public Heap : Type β β Type β Heap A = Branch A -- infixr 5 _++_ -- _++_ : πΉ w (Branch A) β πΉ Ξ΅ (Branch A) β πΉ w (Branch A) -- xs ++ ys = -- xs >>=Ξ΅ Ξ» { [] β ys -- ; (x β· xs) β pure (x β· xs ++ ys) } -- infixr 1 _>>=α΄Ί_ _>>=α΄΄_ -- mutual -- _>>=α΄Ί_ : Node A β (A β Heap B) β Heap B -- β x β >>=α΄Ί f = f x -- β x β >>=α΄Ί f = pure (β weight x β (step x >>=α΄΄ f) β β· pure []) -- _>>=α΄΄_ : πΉ w (Branch A) β (A β Heap B) β πΉ w (Branch B) -- xs >>=α΄΄ f = -- xs >>=Ξ΅ Ξ» { [] β pure [] -- ; (x β· xs) β (x >>=α΄Ί f) ++ (xs >>=α΄΄ f) } -- pureα΄΄ : A β Heap A -- pureα΄΄ x = pure (β x β β· pure []) -- liftα΄΄ : πΉ w A β Heap A -- liftα΄΄ xs = pure (β _ β map (Ξ» x β β x β β· pure []) xs β β· pure []) -- flatten : πΉ w (Branch A) β πΉ w (List A Γ List (Root A)) -- flatten xs = -- xs >>=Ξ΅ Ξ» { [] β pure ([] , []) -- ; (β x β β· xs) β map (mapβ (x β·_)) (flatten xs) -- ; (β x β β· xs) β map (mapβ (x β·_)) (flatten xs) } -- module PopMin -- (_β€|β₯_ : Total (Ξ» x y β β z Γ (y β‘ x β z))) -- (decomp : β {A B wβ wβ wβ} β πΉ (wβ β wβ) A β πΉ (wβ β wβ) B β πΉ wβ (πΉ wβ A Γ πΉ wβ B)) where -- _βͺ_ : Root A β Root A β Root A -- xs βͺ ys with weight xs β€|β₯ weight ys -- ... | inl (k , wΚΈβ‘wΛ£βk) = weight xs β map (Ξ» { (xs , ys) β β k β ys β β· xs }) (decomp (subst (flip πΉ _) (sym (βΞ΅ _)) (step xs)) (subst (flip πΉ _) wΚΈβ‘wΛ£βk (step ys))) -- ... | inr (k , wΛ£β‘wΚΈβk) = weight ys β map (Ξ» { (ys , xs) β β k β xs β β· ys }) (decomp (subst (flip πΉ _) (sym (βΞ΅ _)) (step ys)) (subst (flip πΉ _) wΛ£β‘wΚΈβk (step xs))) -- ββΊ : Root A β List (Root A) β Root A -- ββΊ xβ [] = xβ -- ββΊ xβ (xβ β· []) = xβ βͺ xβ -- ββΊ xβ (xβ β· xβ β· xs) = (xβ βͺ xβ) βͺ ββΊ xβ xs -- β : List (Root A) β Maybe (Root A) -- β [] = nothing -- β (x β· xs) = just (ββΊ x xs) -- popMin : πΉ w (Branch A) β πΉ w (List A Γ Maybe (Root A)) -- popMin = map (mapβ β) β flatten