{-# OPTIONS --without-K --safe #-}
open import Prelude
open import Categories.Category.Monoidal.BiClosed using (BiClosed)
open import Relation.Binary.PropositionalEquality using (_≡_; refl; subst)
open import Categories.Functor.Bifunctor using (module Bifunctor)
open import Categories.Functor.Bifunctor using (module Bifunctor)
open import Data.Product using (uncurry; uncurry′; Σ; _,_; _×_)
open import Level using (_⊔_)
import fil
module fil-examples {o ℓ e} {C : Category o ℓ e} {M : Monoidal C} where
open import Categories.Category.Monoidal.Reasoning M
open import IL.Monoidal M using (_⊗L₀_; _⊗L₁_)
open import fil (M) using (FIL)
open Category C
open MR C
module example-1 (CC : Closed M) {A : Obj} where
open Closed CC
Reader : Endofunctor C
Reader = [ A ,-]
CoReader : Endofunctor C
CoReader = A ⊗-
open Functor Reader using () renaming (F₀ to Reader₀; F₁ to Reader₁) public
open Functor CoReader using () renaming (F₀ to CoReader₀; F₁ to CoReader₁) public
ϕ : (X Y : Obj) → (Reader₀ X) ⊗₀ (CoReader₀ Y) ⇒ (X ⊗₀ Y)
ϕ X Y = (adjoint.counit.η X ⊗₁ id) ∘ associator.to
natural : {X Y Z W : Obj} (f : X ⇒ Z) (g : Y ⇒ W) → ϕ Z W ∘ (Reader₁ f ⊗₁ CoReader₁ g) ≈ (f ⊗₁ g) ∘ ϕ X Y
natural {X} {Y} {Z} {W} f g = begin
(ϕ Z W) ∘ ((Reader₁ f) ⊗₁ (CoReader₁ g))
≈⟨ assoc ⟩
(adjoint.counit.η Z ⊗₁ id) ∘ associator.to ∘ ((Reader₁ f) ⊗₁ (CoReader₁ g))
≈⟨ refl⟩∘⟨ assoc-commute-to ⟩
(adjoint.counit.η Z ⊗₁ id) ∘ ((Reader₁ f ⊗₁ id) ⊗₁ g) ∘ _
≈˘⟨ pushˡ ⊗-distrib-over-∘ ⟩
((adjoint.counit.η Z ∘ (Reader₁ f ⊗₁ id)) ⊗₁ (id ∘ g)) ∘ _
≈⟨ adjoint.counit.commute f ⟩⊗⟨ id-comm-sym ⟩∘⟨refl ⟩
((f ∘ adjoint.counit.η X) ⊗₁ (g ∘ id)) ∘ associator.to
≈⟨ ⊗-distrib-over-∘ ⟩∘⟨refl ○ assoc ⟩
(f ⊗₁ g) ∘ (ϕ X Y)
∎
fil : FIL
fil = record
{ F = Reader
; G = CoReader
; ϕ = ntHelper record
{ η = uncurry ϕ
; commute = uncurry natural }}
module example-2 (BC : BiClosed M) {A : Obj} where
open BiClosed BC
Reader Writer CoReader CoWriter : Endofunctor C
Reader = [ A ,-]
CoReader = A ⊗-
Writer = -⊗ A
CoWriter = ⟦ A ,-⟧
open Functor Reader renaming (F₀ to Reader₀; F₁ to Reader₁)
open Functor CoReader renaming (F₀ to CoReader₀; F₁ to CoReader₁)
open Functor Writer renaming (F₀ to Writer₀; F₁ to Writer₁)
open Functor CoWriter renaming (F₀ to CoWriter₀; F₁ to CoWriter₁)
open adjointˡ.counit using () renaming (η to εˡ)
open adjointˡ.unit using () renaming (η to ηˡ)
open adjointʳ.counit using () renaming (η to εʳ)
open adjointʳ.unit using () renaming (η to ηʳ)
ϕ : (X Y : Obj) → (Reader₀ X) ⊗₀ (CoReader₀ Y) ⇒ (X ⊗₀ Y)
ϕ X Y = (εˡ X ⊗₁ id) ∘ associator.to
ψ : (X Y : Obj) → (Writer₀ X) ⊗₀ (CoWriter₀ Y) ⇒ (X ⊗₀ Y)
ψ X Y = (id ⊗₁ εʳ Y) ∘ associator.from
ϕ-natural : ∀ {X Y Z W} (f : X ⇒ Z) (g : Y ⇒ W) →
ϕ Z W ∘ Reader₁ f ⊗₁ CoReader₁ g ≈ f ⊗₁ g ∘ ϕ X Y
ϕ-natural {X} {Y} {Z} {W} f g = begin
ϕ Z W ∘ (Reader₁ f) ⊗₁ (CoReader₁ g)
≈⟨ pullʳ assoc-commute-to ⟩
(εˡ Z ⊗₁ id) ∘ (Reader₁ f ⊗₁ id) ⊗₁ g ∘ associator.to
≈˘⟨ pushˡ ⊗-distrib-over-∘ ⟩
(εˡ Z ∘ Reader₁ f ⊗₁ id) ⊗₁ (id ∘ g) ∘ associator.to
≈⟨ adjointˡ.counit.commute f ⟩⊗⟨ id-comm-sym ⟩∘⟨refl ⟩
(f ∘ εˡ X) ⊗₁ (g ∘ id) ∘ associator.to
≈⟨ pushˡ ⊗-distrib-over-∘ ⟩
f ⊗₁ g ∘ ϕ X Y
∎
fil-reader : FIL
fil-reader = record
{ F = Reader
; G = CoReader
; ϕ = ntHelper record
{ η = uncurry ϕ
; commute = uncurry ϕ-natural }}
ψ-natural : {X Y Z W : Obj} (f : X ⇒ Z) (g : Y ⇒ W) → ψ Z W ∘ (Writer₁ f ⊗₁ CoWriter₁ g) ≈ (f ⊗₁ g) ∘ ψ X Y
ψ-natural {X} {Y} {Z} {W} f g = begin
(ψ Z W) ∘ ((Writer₁ f) ⊗₁ (CoWriter₁ g)) ≈⟨ assoc ⟩
(id ⊗₁ εʳ W) ∘ associator.from ∘ ((Writer₁ f) ⊗₁ (CoWriter₁ g))
≈⟨ refl⟩∘⟨ assoc-commute-from ⟩
(id ⊗₁ εʳ W) ∘ (f ⊗₁ id ⊗₁ CoWriter₁ g) ∘ _ ≈˘⟨ pushˡ ⊗-distrib-over-∘ ⟩
((id ∘ f) ⊗₁ (εʳ W ∘ (id ⊗₁ CoWriter₁ g)))∘ _ ≈⟨ id-comm-sym ⟩⊗⟨ adjointʳ.counit.commute g ⟩∘⟨refl ⟩
((f ∘ id) ⊗₁ (g ∘ εʳ Y)) ∘ associator.from ≈⟨ ⊗-distrib-over-∘ ⟩∘⟨refl ○ assoc ⟩
(f ⊗₁ g) ∘ (ψ X Y) ∎
fil-writer : FIL
fil-writer = record
{ F = Writer
; G = CoWriter
; ϕ = ntHelper record
{ η = uncurry ψ
; commute = uncurry ψ-natural }}
State CoState : Endofunctor C
State = Reader ∘F Writer
CoState = CoReader ∘F CoWriter
fil-state : FIL
fil-state = fil-reader ⊗L₀ fil-writer
module fil-state = FIL fil-state
_ : fil-state.F ≡ State
_ = refl
_ : fil-state.G ≡ CoState
_ = refl