{-# OPTIONS --without-K --safe #-} module Cats.Trans.Iso where open import Level using (_⊔_) open import Relation.Binary.PropositionalEquality using (_≡_ ; refl) open import Cats.Category.Base open import Cats.Functor using (Functor) open import Cats.Trans using (Trans ; component ; natural) import Cats.Category.Constructions.Iso as Iso open Functor open Iso.Iso module _ {lo la l≈ lo′ la′ l≈′} {C : Category lo la l≈} {D : Category lo′ la′ l≈′} where private module C = Category C module D = Category D open module D≅ = Iso.Build D using (_≅_) module ≅ = D≅.≅ open D.≈-Reasoning record NatIso (F G : Functor C D) : Set (lo ⊔ la ⊔ lo′ ⊔ la′ ⊔ l≈′) where field iso : ∀ {c} → fobj F c ≅ fobj G c forth-natural : ∀ {c d} {f : c C.⇒ d} → forth iso D.∘ fmap F f D.≈ fmap G f D.∘ forth iso back-natural : ∀ {c d} {f : c C.⇒ d} → back iso D.∘ fmap G f D.≈ fmap F f D.∘ back iso back-natural {f = f} = begin back iso D.∘ fmap G f ≈⟨ D.∘-resp-r (D.≈.sym D.id-r) ⟩ back iso D.∘ fmap G f D.∘ D.id ≈⟨ D.∘-resp-r (D.∘-resp-r (D.≈.sym (forth-back iso))) ⟩ back iso D.∘ fmap G f D.∘ forth iso D.∘ back iso ≈⟨ D.∘-resp-r D.unassoc ⟩ back iso D.∘ (fmap G f D.∘ forth iso) D.∘ back iso ≈⟨ D.∘-resp-r (D.∘-resp-l (D.≈.sym forth-natural)) ⟩ back iso D.∘ (forth iso D.∘ fmap F f) D.∘ back iso ≈⟨ D.unassoc ⟩ (back iso D.∘ (forth iso D.∘ fmap F f)) D.∘ back iso ≈⟨ D.∘-resp-l D.unassoc ⟩ ((back iso D.∘ forth iso) D.∘ fmap F f) D.∘ back iso ≈⟨ D.assoc ⟩ (back iso D.∘ (forth iso)) D.∘ fmap F f D.∘ back iso ≈⟨ D.∘-resp-l (back-forth iso) ⟩ D.id D.∘ fmap F f D.∘ back iso ≈⟨ D.id-l ⟩ fmap F f D.∘ back iso ∎ Forth : Trans F G Forth = record { component = λ _ → forth iso ; natural = forth-natural } Back : Trans G F Back = record { component = λ _ → back iso ; natural = back-natural } open NatIso public id : ∀ {F} → NatIso F F id = record { iso = ≅.refl ; forth-natural = D.≈.trans D.id-l (D.≈.sym D.id-r) } sym : ∀ {F G} → NatIso F G → NatIso G F sym θ = record { iso = ≅.sym (iso θ) ; forth-natural = back-natural θ } _∘_ : ∀ {F G H} → NatIso G H → NatIso F G → NatIso F H _∘_ {F} {G} {H} θ ι = record { iso = ≅.trans (iso ι) (iso θ) ; forth-natural = λ {_} {_} {f} → begin (forth (iso θ) D.∘ forth (iso ι)) D.∘ fmap F f ≈⟨ D.assoc ⟩ forth (iso θ) D.∘ forth (iso ι) D.∘ fmap F f ≈⟨ D.∘-resp-r (forth-natural ι) ⟩ forth (iso θ) D.∘ fmap G f D.∘ forth (iso ι) ≈⟨ D.unassoc ⟩ (forth (iso θ) D.∘ fmap G f) D.∘ forth (iso ι) ≈⟨ D.∘-resp-l (forth-natural θ) ⟩ (fmap H f D.∘ forth (iso θ)) D.∘ forth (iso ι) ≈⟨ D.assoc ⟩ fmap H f D.∘ forth (iso θ) D.∘ forth (iso ι) ∎ }