{-# OPTIONS --safe --with-K #-}
module Generics.Ornament.Description where
open import Prelude
open import Generics.Telescope
open import Generics.Description
open import Generics.Ornament
private variable
A : Set ℓ
n : ℕ
rb rb' : RecB
cb cb' : ConB
cbs cbs' : ConBs
module _ (I : Set ℓⁱ) {J : Set ℓʲ} (e : I → J) where
infixr 5 _∷_
infix 5 ∺_
data RecOD : RecD J rb → Setω where
ι : ∀ i {j} ⦃ eq : e i ≡ j ⦄ → RecOD (ι j)
π : {E : A → RecD J rb} (OD : (a : A) → RecOD (E a)) → RecOD (π A E)
data ConOD : ConD J cb → ConB → Setω where
ι : ∀ i {j} ⦃ eq : e i ≡ j ⦄ → ConOD (ι j) []
σ : {A : Set ℓ} {E : A → ConD J cb}
(OD : (a : A) → ConOD (E a) cb') → ConOD (σ A E) (inl ℓ ∷ cb')
Δ : (A : Set ℓ) {E : ConD J cb}
(OD : (a : A) → ConOD E cb') → ConOD E (inl ℓ ∷ cb')
∇ : {E : A → ConD J cb} (a : A) (OD : ConOD (E a) cb') → ConOD (σ A E) cb'
ρ : {S : RecD J rb} {E : ConD J cb}
(OD : RecOD S) (OD' : ConOD E cb') → ConOD (ρ S E) (inr rb ∷ cb')
syntax π (λ a → D) = π[ a ] D
syntax σ (λ a → D) = σ[ a ] D
syntax Δ A (λ a → D) = Δ[ a ∶ A ] D
data ConODs : ConDs J cbs → ConBs → Setω where
[] : ConODs [] []
_∷_ : {E : ConD J cb} {Es : ConDs J cbs}
(OD : ConOD E cb') (ODs : ConODs (E ∷ Es) cbs')
→ ConODs (E ∷ Es) (cb' ∷ cbs')
∺_ : {E : ConD J cb} {Es : ConDs J cbs}
(ODs : ConODs Es cbs') → ConODs (E ∷ Es) cbs'
idRecOD : {I : Set ℓⁱ} (D : RecD I rb) → RecOD I id D
idRecOD (ι i ) = ι i
idRecOD (π A D) = π λ a → idRecOD (D a)
record PDataOD (E : PDataD) : Setω where
field
alevel : Level
{plevel} : Level
{ilevel} : Level
{struct} : ConBs
dlevel : Level
dlevel = alevel ⊔ ilevel
flevel : Level → Level
flevel ℓ = maxMap max-π struct ⊔ maxMap max-σ struct ⊔
maxMap (hasRec? ℓ) struct ⊔ hasCon? ilevel struct
field
⦃ level-inequality ⦄ : maxMap max-π struct ⊔ maxMap max-σ struct ⊑ dlevel
Param : Tel plevel
param : ⟦ Param ⟧ᵗ → ⟦ PDataD.Param E ⟧ᵗ
Index : ⟦ Param ⟧ᵗ → Tel ilevel
index : (ps : ⟦ Param ⟧ᵗ) → ⟦ Index ps ⟧ᵗ → ⟦ PDataD.Index E (param ps) ⟧ᵗ
applyP : (ps : ⟦ Param ⟧ᵗ)
→ ConODs ⟦ Index ps ⟧ᵗ (index ps) (PDataD.applyP E (param ps)) struct
record DataOD (E : DataD) : Setω where
field
#levels : ℕ
Levels : Set
Levels = Level ^ #levels
field
level : Levels → DataD.Levels E
applyL : (ℓs : Levels) → PDataOD (DataD.applyL E (level ℓs))
module _ {I : Set ℓⁱ} {J : Set ℓʲ} {e : I → J} where
⌊_⌋ʳ : {E : RecD J rb} → RecOD I e E → RecD I rb
⌊ ι i ⌋ʳ = ι i
⌊ π OD ⌋ʳ = π _ λ a → ⌊ OD a ⌋ʳ
⌈_⌉ʳ : {E : RecD J rb} (OD : RecOD I e E) → RecO e ⌊ OD ⌋ʳ E
⌈ ι i ⌉ʳ = ι
⌈ π OD ⌉ʳ = π λ a → ⌈ OD a ⌉ʳ
⌊_⌋ᶜ : {E : ConD J cb} → ConOD I e E cb' → ConD I cb'
⌊ ι i ⌋ᶜ = ι i
⌊ ρ OD OD' ⌋ᶜ = ρ ⌊ OD ⌋ʳ ⌊ OD' ⌋ᶜ
⌊ σ OD ⌋ᶜ = σ _ λ a → ⌊ OD a ⌋ᶜ
⌊ Δ A OD ⌋ᶜ = σ A λ a → ⌊ OD a ⌋ᶜ
⌊ ∇ a OD ⌋ᶜ = ⌊ OD ⌋ᶜ
⌈_⌉ᶜ : {E : ConD J cb} (OD : ConOD I e E cb') → ConO e ⌊ OD ⌋ᶜ E
⌈ ι i ⌉ᶜ = ι
⌈ ρ OD OD' ⌉ᶜ = ρ ⌈ OD ⌉ʳ ⌈ OD' ⌉ᶜ
⌈ σ OD ⌉ᶜ = σ λ a → ⌈ OD a ⌉ᶜ
⌈ Δ A OD ⌉ᶜ = Δ λ a → ⌈ OD a ⌉ᶜ
⌈ ∇ a OD ⌉ᶜ = ∇ a ⌈ OD ⌉ᶜ
⌊_⌋ᶜˢ : {Es : ConDs J cbs} → ConODs I e Es cbs' → ConDs I cbs'
⌊ [] ⌋ᶜˢ = []
⌊ OD ∷ ODs ⌋ᶜˢ = ⌊ OD ⌋ᶜ ∷ ⌊ ODs ⌋ᶜˢ
⌊ ∺ ODs ⌋ᶜˢ = ⌊ ODs ⌋ᶜˢ
⌈_⌉ᶜˢ : {Es : ConDs J cbs} (ODs : ConODs I e Es cbs') → ConOs e ⌊ ODs ⌋ᶜˢ Es
⌈ [] ⌉ᶜˢ = []
⌈ OD ∷ ODs ⌉ᶜˢ = ⌈ OD ⌉ᶜ ∷ ⌈ ODs ⌉ᶜˢ
⌈ ∺ ODs ⌉ᶜˢ = ∺ ⌈ ODs ⌉ᶜˢ
⌊_⌋ᵖᵈ : ∀ {E} → PDataOD E → PDataD
⌊ OD ⌋ᵖᵈ = record
{ alevel = PDataOD.alevel OD
; Param = PDataOD.Param OD
; Index = PDataOD.Index OD
; applyP = λ ps → ⌊ PDataOD.applyP OD ps ⌋ᶜˢ }
⌈_⌉ᵖᵈ : ∀ {E} (OD : PDataOD E) → PDataO ⌊ OD ⌋ᵖᵈ E
⌈ OD ⌉ᵖᵈ = record
{ param = PDataOD.param OD
; index = PDataOD.index OD
; applyP = λ ps → ⌈ PDataOD.applyP OD ps ⌉ᶜˢ }
⌊_⌋ᵈ : ∀ {E} → DataOD E → DataD
⌊ OD ⌋ᵈ = record
{ #levels = DataOD.#levels OD
; applyL = λ ℓs → ⌊ DataOD.applyL OD ℓs ⌋ᵖᵈ }
⌈_⌉ᵈ : ∀ {E} (OD : DataOD E) → DataO ⌊ OD ⌋ᵈ E
⌈ OD ⌉ᵈ = record
{ level = DataOD.level OD
; applyL = λ ℓs → ⌈ DataOD.applyL OD ℓs ⌉ᵖᵈ }