{-# OPTIONS --cubical #-}
open import ContainersPlus
open import MndContainer as MC
open MC.MndContainer
open import MndContainerMorphism
open import Level renaming (suc to lsuc ; zero to lzero)
open import Function
open import Cubical.Foundations.Prelude hiding (_◁_)
open import Cubical.Data.Sigma renaming (fst to π₁ ; snd to π₂)
record MndCompatibleComposite (ℓs ℓp : Level)
                              (S : Set ℓs) (P : S → Set ℓp) (T : Set ℓs) (Q : T → Set ℓp)
                              (Aₘ : MndContainer _ _ (S ◁ P)) (Bₘ : MndContainer _ _ (T ◁ Q)) :
                              Set (lsuc (ℓs ⊔ ℓp)) where
  ιᶜ : ⟦ S ◁ P ⟧ T
  ιᶜ = (ι Aₘ , const (ι Bₘ))
  
  field
    σᶜ : (s : ⟦ S ◁ P ⟧ T) → (◇ P Q s → ⟦ S ◁ P ⟧ T) → ⟦ S ◁ P ⟧ T
    prᶜ₁ : (s : ⟦ S ◁ P ⟧ T) → (f : ◇ P Q s → ⟦ S ◁ P ⟧ T) → 
           (p : ◇ P Q (σᶜ s f)) → ◇ P Q s 
    prᶜ₂ : (s : ⟦ S ◁ P ⟧ T) → (f : ◇ P Q s → ⟦ S ◁ P ⟧ T) → 
           (p : ◇ P Q (σᶜ s f)) → ◇ P Q (f (prᶜ₁ s f p))
    isMCont : IsMndContainer _ _ (⟦ S ◁ P ⟧ T) (◇ P Q) ιᶜ σᶜ prᶜ₁ prᶜ₂
  MCont : MndContainer _ _ ((⟦ S ◁ P ⟧ T) ◁ (◇ P Q))
  MCont = mContBuilder _ _ _ _ ιᶜ σᶜ prᶜ₁ prᶜ₂ isMCont
  field
    s-inj : IsMndContainerMorphism _ _ _ _ S P (⟦ S ◁ P ⟧ T) (◇ P Q) Aₘ MCont (λ s → (s , const (ι Bₘ))) π₁
    t-inj : IsMndContainerMorphism _ _ _ _ T Q (⟦ S ◁ P ⟧ T) (◇ P Q) Bₘ MCont (λ t → (ι Aₘ , const t)) π₂
    middle-unit-shape : (s : S) (f : P s → T) → (s , f) ≡ σᶜ (s , const (ι Bₘ)) (λ p → (ι Aₘ , const (f (π₁ p))))
    middle-unit-pos : (s : S) (f : P s → T) →
                      PathP (λ i → ◇ P Q (middle-unit-shape s f i) → ◇ P Q (s , f))
                            (λ x → x)
                            (λ x → (π₁ (prᶜ₁ _ _ x) , π₂ (prᶜ₂ _ _ x)))