open import Cubical.Foundations.Prelude hiding (Sub)
open import Cubical.Foundations.Transport
open import Cubical.Foundations.HLevels
open import Cubical.Data.Unit
open import Cubical.Data.Empty.Base

module TT.Set.ConPath (X : hSet ℓ-zero) (Y : X .fst  hSet ℓ-zero) where

open import TT.Set.Syntax X Y

Cover : Con  Con  Type
decode : (Γ₀ Γ₁ : Con)  Cover Γ₀ Γ₁  Γ₀  Γ₁

Cover   = Unit
Cover (Γ₀  A₀) (Γ₁  A₁) =
  Σ[ Γ₀₁  Cover Γ₀ Γ₁ ] PathP  i  Ty (decode Γ₀ Γ₁ Γ₀₁ i)) A₀ A₁
{-# CATCHALL #-}
Cover _ _ = 

decode   tt = refl
decode (Γ₀  A₀) (Γ₁  A₁) (Γ₀₁ , A₀₁) = cong₂ _▹_ (decode Γ₀ Γ₁ Γ₀₁) A₀₁

reflCode : (Γ : Con)  Cover Γ Γ
decodeRefl : (Γ : Con)  decode Γ Γ (reflCode Γ)  refl

reflCode  = tt
reflCode (Γ  A) = reflCode Γ , filler i1
  module reflCode-▹ where
  filler : (i : I)  PathP  j  Ty (decodeRefl Γ (~ i) j)) A A
  filler i =
    transport⁻-filler  i  PathP  j  Ty (decodeRefl Γ i j)) A A) refl i

decodeRefl  i = refl
decodeRefl (Γ  A) i = cong₂ _▹_ (decodeRefl Γ i) (reflCode-▹.filler Γ A (~ i))

encode : (Γ₀ Γ₁ : Con)  Γ₀  Γ₁  Cover Γ₀ Γ₁
encode Γ₀ Γ₁ Γ₀₁ = transport  i  Cover Γ₀ (Γ₀₁ i)) (reflCode Γ₀)

decodeEncode :
  (Γ₀ Γ₁ : Con) (Γ₀₁ : Γ₀  Γ₁)  decode Γ₀ Γ₁ (encode Γ₀ Γ₁ Γ₀₁)  Γ₀₁
decodeEncode Γ₀ Γ₁ Γ₀₁ =
  J  Γ₁ Γ₀₁  decode Γ₀ Γ₁ (encode Γ₀ Γ₁ Γ₀₁)  Γ₀₁)
    (cong (decode Γ₀ Γ₀) (transportRefl _)  decodeRefl Γ₀)
    Γ₀₁

isPropCover : (Γ₀ Γ₁ : Con)  isProp (Cover Γ₀ Γ₁)
isPropCover   = isPropUnit
isPropCover (Γ₀  A₀) (Γ₁  A₁) =
  isPropΣ (isPropCover Γ₀ Γ₁) λ Γ₀₁  isOfHLevelPathP' 1 (isSetTy Γ₁) A₀ A₁

isSetCon : isSet Con
isSetCon Γ₀ Γ₁ =
  isPropRetract
    (encode Γ₀ Γ₁)
    (decode Γ₀ Γ₁)
    (decodeEncode Γ₀ Γ₁)
    (isPropCover Γ₀ Γ₁)