module Cartesian where

open import Stdlib
open import Signature hiding (_∘_)

record Cartesian {I⁺ I}(Σ⁺ : Sig I⁺)(Σ : Sig I)(u : I⁺  I) : Set₁ where
  open Sig
  field
    σ   :  i⁺  Op Σ⁺ i⁺  Op Σ (u i⁺)
    ρ   :  i⁺  (op⁺ : Op Σ⁺ i⁺)  Ar Σ (σ i⁺ op⁺)  Ar Σ⁺ op⁺
    coh :  i⁺ op⁺  (ar : Ar Σ (σ i⁺ op⁺))  
          u (Ty Σ⁺ (subst id (ρ i⁺ op⁺) ar))  Ty Σ ar

⟦_⟧C : ∀{I⁺ I}{Σ⁺ : Sig I⁺}{Σ : Sig I}{u : I⁺  I}  
       Cartesian Σ⁺ Σ u  
       (X : I  Set)(i⁺ : I⁺)   Σ⁺  (X  u) i⁺   Σ  X (u i⁺)
 τ ⟧C X i⁺ (op⁺ , args⁺) = σ i⁺ op⁺ , λ ar  
                                         subst X (coh i⁺ op⁺ ar) 
                                                 (args⁺ (subst id (ρ i⁺ op⁺) ar))
  where open Cartesian τ