{-# OPTIONS --without-K --safe --lossy-unification #-}
open import Prelude
open import Categories.NaturalTransformation.NaturalIsomorphism using (unitorˡ; unitorʳ)
open import Relation.Binary using (Rel; IsEquivalence; Setoid)
open NaturalTransformation using (η)
module MCIL.Core  {o ℓ e} {C : Category o ℓ e} (MC : Monoidal C) where
open import IL (MC) renaming (id to idIL) 
open import fil (MC) using (FIL; isFIL;FIL[_,_,_])
private
  module C = Category C
  module C² = Category (C ×ᶜ C)
  module IL = Category IL
open C using (_≈_; _∘_) renaming (id to idC)
open Monoidal MC using (⊗; _⊗₀_; _⊗₁_)
record mcIL : Set (o ⊔ ℓ ⊔ e) where
  constructor MCIL[_,_,_]
  field
    T : Monad C
    D : Comonad C
  module T = Monad T
  module D = Comonad D renaming (F to G)
  field
    ψ : isFIL T.F D.G
  module ψ = NaturalTransformation ψ
  as-fil : FIL
  as-fil = FIL[ T.F , D.G , ψ ]
  field
    triangle : ∀{X Y : C.Obj} → idC ⊗₁ D.ε .η Y ≈ ψ.η (X , Y) ∘ T.η .η X ⊗₁ idC
    pentagon : ∀{X Y : C.Obj} → ψ.η (X , Y) ∘ ψ.η (T.₀ X , D.₀ Y) ∘ (idC ⊗₁ D.δ .η Y) ≈ ψ.η (X , Y) ∘ (T.μ .η X ⊗₁ idC)
    
    
    
    
    
    
    
    
    
    
record _⇒ᵐᶜⁱˡ_ (f₁ f₂ : mcIL) : Set (o ⊔ ℓ ⊔ e) where
  module f₁ = mcIL f₁
  open f₁ using (T; D; ψ)
  module f₂ = mcIL f₂
  open f₂ using () renaming (ψ to φ; T to T'; D to D')
  field
    
    f : T' M⇒ T
    
    g : D' CM⇒ D
  module f = Monad⇒-id f
  module g = Comonad⇒-id g
  field
    isMap : isFILM f₁.as-fil f₂.as-fil f.α g.α
  as-film : f₁.as-fil ⇒ᶠⁱˡ f₂.as-fil
  as-film = FILM⟨ f.α , g.α , isMap ⟩
_≃ᵐᶜⁱˡ_ : ∀ {f₁ f₂ : mcIL} → Rel (f₁ ⇒ᵐᶜⁱˡ f₂) (o ⊔ e)
a ≃ᵐᶜⁱˡ b = a.as-film ≃ᶠⁱˡ b.as-film
  where module a = _⇒ᵐᶜⁱˡ_ a
        module b = _⇒ᵐᶜⁱˡ_ b
module _ {L : mcIL} where
  open _⇒ᵐᶜⁱˡ_
  open _⇒ᶠⁱˡ_
  idMCIL : L ⇒ᵐᶜⁱˡ L
  idMCIL .f = M⇒-id
  idMCIL .g = CM⇒-id
  idMCIL .isMap = IL.id .isMap
module _ {L₁ L₂ L₃ : mcIL} where
  open _⇒ᶠⁱˡ_
  open _⇒ᵐᶜⁱˡ_
  _∘ᵐᶜⁱˡ_ : L₂ ⇒ᵐᶜⁱˡ L₃ → L₁  ⇒ᵐᶜⁱˡ L₂ → L₁ ⇒ᵐᶜⁱˡ L₃
  (α ∘ᵐᶜⁱˡ β) .f = β .f ∘M α .f
  (α ∘ᵐᶜⁱˡ β) .g = β .g ∘CM α .g
  (α ∘ᵐᶜⁱˡ β) .isMap = (α.as-film ∘ᶠⁱˡ β.as-film) .isMap
    where module α = _⇒ᵐᶜⁱˡ_ α
          module β = _⇒ᵐᶜⁱˡ_ β
MCIL : Category (o ⊔ ℓ ⊔ e) (o ⊔ ℓ ⊔ e) (o ⊔ e)
MCIL = record
  { Obj       = mcIL
  ; _⇒_       = _⇒ᵐᶜⁱˡ_
  ; _≈_       = _≃ᵐᶜⁱˡ_
  ; id        = idMCIL
  ; _∘_       = _∘ᵐᶜⁱˡ_
  
  ; ∘-resp-≈  = λ {_} {_} {_} {f} {h} {g} {i} → IL.∘-resp-≈ {f = ↓ f} {↓ h} {↓ g} {↓ i}
  ; assoc     = λ {_} {_} {_} {_} {f} {g} {h} → IL.assoc {f = ↓ f} {↓ g} {↓ h}
  ; sym-assoc = λ {_} {_} {_} {_} {f} {g} {h} → IL.sym-assoc {f = ↓ f} {↓ g} {↓ h}
  ; identityˡ = λ {_} {_} {f = f₁} → IL.identityˡ {f = ↓ f₁}
  ; identityʳ = λ {_} {_} {f = f₁} → IL.identityʳ {f = ↓ f₁}
  ; identity² = λ {A} → IL.identity² {mcIL.as-fil A}
  ; equiv     = λ {f₁ f₂ : mcIL} → record
                  { refl = λ {f} → IL.Equiv.refl {x = ↓ f}
                  ; sym = λ {f} {g} → IL.Equiv.sym {x = ↓ f}
                  ; trans = λ {f} {g} {h} → IL.Equiv.trans {i = ↓ f}
                  }
  }
  where open _⇒ᵐᶜⁱˡ_ renaming (as-film to ↓)