module Staged.Denote.Sig where

open import Function using (id ; _∘_)
open import Data.Sum using (_⊎_ ; inj₁ ; inj₂)

open import Relation.Binary.PropositionalEquality using (_≡_ ; refl ; subst ; trans ; cong ; sym)

module _ where

  record Sig : Set₁ where
    constructor _▹_∣_▹_  
    field S₁ : Set
          P₁ : S₁  Set
          S₂ : S₁  Set
          P₂ :  {s₁}  S₂ s₁  Set

  open Sig

  infixr 15 _⊕_
  _⊕_ : (ζ₁ ζ₂ : Sig)  Sig
  S₁ (ζ₁  ζ₂)             = S₁ ζ₁  S₁ ζ₂
  P₁ (ζ₁  ζ₂) (inj₁ x)    = P₁ ζ₁ x
  P₁ (ζ₁  ζ₂) (inj₂ y)    = P₁ ζ₂ y
  S₂ (ζ₁  ζ₂) (inj₁ x)    = S₂ ζ₁ x
  S₂ (ζ₁  ζ₂) (inj₂ y)    = S₂ ζ₂ y
  P₂ (ζ₁  ζ₂) {inj₁ x} r  = P₂ ζ₁ r
  P₂ (ζ₁  ζ₂) {inj₂ y} r  = P₂ ζ₂ r

module _ where 

  infix 10 _⊏_
  record _⊏_ (ζ₁ ζ₂ : Sig) : Set₁ where 
    open Sig
    field  inj  : S₁ ζ₁  S₁ ζ₂
           P₁≡ :  {op}  P₁ ζ₂ (inj op)  P₁ ζ₁ op 
           S₂≡ :  {op}  S₂ ζ₂ (inj op)  S₂ ζ₁ op
           P₂≡ :  {op} {s₂ : S₂ ζ₂ (inj op)}  P₂ ζ₁ (subst id S₂≡ s₂)  P₂ ζ₂ s₂

  variable ζ ζ₁ ζ₂ ζ₃ : Sig
             
  open _⊏_ ⦃...⦄

  instance ⊏-refl : ζ  ζ
  _⊏_.inj  ⊏-refl = id
  _⊏_.P₁≡ ⊏-refl = refl
  _⊏_.S₂≡ ⊏-refl = refl
  _⊏_.P₂≡ ⊏-refl = refl

  instance ⊏-left : ζ₁  ζ₁  ζ₂
  _⊏_.inj  ⊏-left = inj₁
  _⊏_.P₁≡ ⊏-left = refl
  _⊏_.S₂≡ ⊏-left = refl
  _⊏_.P₂≡ ⊏-left = refl

  
  eq≡ :  {} {A : Set } {x y : A}  (eq₁ : x  y)  (eq₂ : x  y)  eq₁  eq₂
  eq≡ refl refl = refl

  instance ⊏-right :  ζ₁  ζ₃   ζ₁  ζ₂  ζ₃  
  _⊏_.inj  ⊏-right = inj₂  inj 
  _⊏_.P₁≡ (⊏-right  w ⦄) {op}     rewrite (P₁≡  w  {op}) = refl
  _⊏_.S₂≡ (⊏-right  w ⦄) {op}     rewrite (S₂≡  w  {op}) = refl
  _⊏_.P₂≡ (⊏-right {ζ₁}   w ⦄) {op} {z} rewrite (sym (P₂≡  w  {op} {z})) =
    cong (Sig.P₂ ζ₁) let zeq = (S₂≡  w  {op}) in cong  x  subst id x z) (eq≡ _ _)