{-# OPTIONS --without-K --safe #-}

open import Level using (Level)
open import Categories.Category using (Category)
open import Categories.Category.Monoidal using (Monoidal)

module Categories.Tactic.Monoidal.Examples
  {o  e a : Level}
  {𝒞 : Category o  e}
  (M : Monoidal 𝒞)
  {Atom : Set a}
  (⟦_⟧ₐ : Atom  Category.Obj 𝒞)
  (w x y z : Atom)
  where

open import Relation.Binary.PropositionalEquality using (refl)

open import Categories.Tactic.Monoidal.Core M ⟦_⟧ₐ
open import Categories.Tactic.Monoidal using (solve₀; solveMonoidal)

open import Categories.Morphism 𝒞 using (_≅_)
open Category 𝒞 hiding (_⇒_)
open Monoidal M hiding () renaming (_⊗₁_ to _⊗₁ᶜ_)
open Free Atom renaming (_∘_ to _∘ᶠ_)

private
  assoc-iso :  ( w    x )   y  ⟧₀    w   ( x    y ) ⟧₀
  assoc-iso = object-coherence {X = ( w    x )   y }
                               {Y =  w   ( x    y )} refl

  assoc-iso-solved :  ( w    x )   y  ⟧₀    w   ( x    y ) ⟧₀
  assoc-iso-solved = solve₀ M ⟦_⟧ₐ

  unit-iso :  (I   w )  ( x   I) ⟧₀    w    x  ⟧₀
  unit-iso = object-coherence {X = (I   w )  ( x   I)}
                              {Y =  w    x } refl

  unit-iso-solved :  (I   w )  ( x   I) ⟧₀    w    x  ⟧₀
  unit-iso-solved = solve₀ M ⟦_⟧ₐ

  reassoc-cancel
    :  α⇐ ∘ᶠ α⇒ { w } { x } { y } ⟧₁
        idₘ {( w    x )   y } ⟧₁
  reassoc-cancel =
    coherence-from-loop {f = α⇐ ∘ᶠ α⇒ { w } { x } { y }} {g = idₘ}
      (Equiv.trans identityˡ associator.isoˡ)

  triangle-faithful
    :  (idₘ ⊗₁ λ⇒) ∘ᶠ α⇒ { w } {I} { x } ⟧₁
        ρ⇒ { w } ⊗₁ idₘ { x } ⟧₁
  triangle-faithful = triangle

  pentagon-faithful
    :  (idₘ ⊗₁ α⇒) ∘ᶠ
        (α⇒ ∘ᶠ (α⇒ { w } { x } { y } ⊗₁ idₘ { z })) ⟧₁
        α⇒ ∘ᶠ α⇒ { w    x } { y } { z } ⟧₁
  pentagon-faithful = pentagon

  reassoc-cancel-goal : Set e
  reassoc-cancel-goal =
     α⇐ ∘ᶠ α⇒ { w } { x } { y } ⟧₁
      idₘ {( w    x )   y } ⟧₁

  reassoc-cancel-solved
    :  α⇐ ∘ᶠ α⇒ { w } { x } { y } ⟧₁
        idₘ {( w    x )   y } ⟧₁
  reassoc-cancel-solved = solveMonoidal M ⟦_⟧ₐ