module QWI.SizeIndexedStructure where
open import QWI.ColimitsOfSizedIndexedDiagrams public
module SizeIdxStruct
  {l : Level}
  (I : Set l)
  (Σ : Slice.Sig I)
  (ε : Slice.Syseq I Σ)
  
  
  
  
  (Size : Set l)
  {{ssz : SizeStructure Size}}
  where
  open Slice I
  private
    Γ = Syseq.Γ ε
    lhs = Syseq.lhs ε
    rhs = Syseq.rhs ε
  open Colim Size {{ssz}}
  
  record IdxStruct : Set (lsuc l) where
    constructor mkIdxStruct
    field
      D : Size → Setᴵ l 
      τ : ∀ i → ∏ᵇ j < i , (T{Σ}(D j) ⇁ D i)
  open IdxStruct public
  
  
  record IdxStructᵇ (i : Size) : Set (lsuc l) where
    constructor mkIdxStructᵇ
    field
      Dᵇ : ∏ᵇ j < i , Setᴵ l
      τᵇ : ∏ᵇ j < i , ∏ᵇ k < j , (T{Σ}(Dᵇ k) ⇁ Dᵇ j)
  open IdxStructᵇ public
  infixl 6 _↓_
  
  _↓_ : IdxStruct → ∀ i → IdxStructᵇ i
  Dᵇ (A ↓ _) j   = D A j
  τᵇ (A ↓ _) j k = τ A j k
  infixl 6 _↓ᵇ_
  
  
  _↓ᵇ_ : {i : Size} → IdxStructᵇ i → ∏ᵇ j < i , IdxStructᵇ j
  Dᵇ (A ↓ᵇ _) j  = Dᵇ A j
  τᵇ (A ↓ᵇ _) j k = τᵇ A j k
  Wᵇ : ∀{i} → IdxStructᵇ i → Setᴵ l
  Wᵇ {i} A n = ∑ᵇ j < i , T{Σ} (Dᵇ A j) n
  
  data Rᵇ
    {i : Size}
    (A : IdxStructᵇ i)
    (n : I)
    : 
    Wᵇ A n → Wᵇ A n → Prop l
    where
    τεᵇ : ∀ᵇ j < i ,
      ((e : Op Γ n)
       (ρ : Ar Γ n e ⇁ Dᵇ A j)
        → 
        Rᵇ A n (pairᵇ j (T' ρ n (lhs n e))) (pairᵇ j (T' ρ n (rhs n e))))
    τηᵇ : ∀ᵇ j < i , ∀ᵇ k < j ,
      ((t : T{Σ}(Dᵇ A k) n)
        → 
        Rᵇ A n (pairᵇ j (η n (τᵇ A j k n t))) (pairᵇ k t))
    τσᵇ : ∀ᵇ j < i , ∀ᵇ k < j ,
      ((a : Op Σ n)
        (f : Ar Σ n a ⇁ T (Dᵇ A k))
        → 
        Rᵇ A n (pairᵇ k (σ n (a , f)))
            (pairᵇ j (σ n (a , λ m b → η m (τᵇ A j k m (f m b))))))
  
  ◇ : ∀{i} → IdxStructᵇ i → Setᴵ l
  ◇ A n = Wᵇ A n / Rᵇ A n
  
  ◇fix : IdxStruct → Prop (lsuc l)
  ◇fix alg =
    ∀ i → (∀ n → D alg i n == ◇ (alg ↓ i) n) ∧
    ∀ᵇ j < i , (∀ n t → τ alg i j n t === [ pairᵇ j t ]/ Rᵇ (alg ↓ i) n)
  
  
  
  FixSizeStruct : Set (lsuc l)
  FixSizeStruct = set IdxStruct ◇fix
  
  
  
  FixSizeStructᵇ : Size → Set (lsuc l)
  FixSizeStructᵇ i = set (IdxStructᵇ i) isFixSizeStructᵇ
    module _ where
    isFixSizeStructᵇ : IdxStructᵇ i → Prop (lsuc l)
    isFixSizeStructᵇ alg =
      ∀ᵇ j < i , ((∀ n → Dᵇ alg j n == ◇ (alg ↓ᵇ j) n)
        ∧ ∀ᵇ k < j ,
          ((n : I)
          (t : T {Σ} (Dᵇ (mkIdxStructᵇ (Dᵇ alg) (τᵇ alg)) k) n)
          → 
          τᵇ alg j k n t === [ pairᵇ k t ]/ Rᵇ (alg ↓ᵇ j) n    ))