{-# OPTIONS --cubical --safe #-} module Control.Monad.Levels.Eliminators where open import Prelude open import Data.Bag open import Control.Monad.Levels.Definition record Eliminator {a p} (A : Type a) (P : Levels A → Type p) : Type (a ℓ⊔ p) where constructor elim field ⟦_⟧-set : ∀ {xs} → isSet (P xs) ⟦_⟧_∷_⟨_⟩ : ∀ x xs → P xs → P (x ∷ xs) ⟦_⟧[] : P [] ⟦_⟧-trail : PathP (λ i → P (trail i)) (⟦_⟧_∷_⟨_⟩ [] [] ⟦_⟧[]) ⟦_⟧[] run : ∀ xs → P xs run (x ∷ xs) = ⟦_⟧_∷_⟨_⟩ x xs (run xs) run [] = ⟦_⟧[] run (trail i) = ⟦_⟧-trail i run (trunc xs ys x y i j) = isOfHLevel→isOfHLevelDep 2 (λ xs → ⟦_⟧-set {xs}) (run xs) (run ys) (cong run x) (cong run y) (trunc xs ys x y) i j _⇓_ : (xs : Levels A) → P xs _⇓_ = run {-# INLINE _⇓_ #-} open Eliminator public infixr 1 Eliminator syntax Eliminator A (λ v → e) = Levels-Π[ v ⦂ e ] A record Recursor (A : Type a) (B : Type b) : Type (a ℓ⊔ b) where constructor rec field [_]-set : isSet B [_]_∷_⟨_⟩ : (x : ⟅ A ⟆) → (xs : Levels A) → B → B [_][] : B private f = [_]_∷_⟨_⟩; z = [_][] field [_]-trail : f [] [] z ≡ z _↑ : Eliminator A (λ _ → B) _↑ = elim [_]-set f z [_]-trail _↓_ : Levels A → B _↓_ = run _↑ {-# INLINE _↑ #-} {-# INLINE _↓_ #-} open Recursor public infixr 1 Recursor syntax Recursor A B = Levels-ϕ[ A ] B infix 4 _⊜_ record AnEquality (A : Type a) : Type a where constructor _⊜_ field lhs rhs : Levels A open AnEquality public record Property {r} (A : Type a) (P : Levels A → Type r) : Type (a ℓ⊔ r) where constructor property field ∥_∥-prop : ∀ {xs} → isProp (P xs) ∥_∥_∷_⟨_⟩ : (x : ⟅ A ⟆) → (xs : Levels A) → P xs → P (x ∷ xs) ∥_∥[] : P [] private z = ∥_∥[]; f = ∥_∥_∷_⟨_⟩ ∥_∥⇑ = elim (λ {xs} → isProp→isSet (∥_∥-prop {xs})) f z (toPathP (∥_∥-prop (transp (λ i → P (trail i)) i0 (f [] [] z)) z)) ∥_∥⇓ = run ∥_∥⇑ {-# INLINE ∥_∥⇑ #-} {-# INLINE ∥_∥⇓ #-} open Property public infixr 1 Property syntax Property A (λ v → e) = Levels-ψ[ v ⦂ A ] e record EqualityProof {B : Type b} (A : Type a) (P : Levels A → AnEquality B) : Type (a ℓ⊔ b) where Pr : Levels A → Type b Pr xs = let e = P xs in lhs e ≡ rhs e field ⟦_⟧≡_∷_⟨_⟩ : (x : ⟅ A ⟆) → (xs : Levels A) → Pr xs → Pr (x ∷ xs) ⟦_⟧≡[] : Pr [] _⇑≡ : Eliminator A Pr _⇑≡ = ∥ property (trunc _ _) ⟦_⟧≡_∷_⟨_⟩ ⟦_⟧≡[] ∥⇑ _⇓≡_ : (xs : Levels A) → Pr xs _⇓≡_ = run _⇑≡ {-# INLINE _⇑≡ #-} {-# INLINE _⇓≡_ #-} open EqualityProof public infixr 1 EqualityProof syntax EqualityProof A (λ v → e) = Levels-ψ[ v ⦂ A ]≡ e