{-# OPTIONS --safe #-}

module Cubical.Categories.Adjoint.Monad where

open import Cubical.Foundations.Prelude

open import Cubical.Categories.Category
open import Cubical.Categories.Functor
open import Cubical.Categories.Monad.Base
open import Cubical.Categories.Adjoint
open import Cubical.Categories.NaturalTransformation.Base
open import Cubical.Categories.NaturalTransformation.Properties

open import Cubical.Categories.NaturalTransformation.More

open import Cubical.Tactics.CategorySolver.Reflection

private
  variable
    ℓC ℓC' ℓD ℓD' : Level

module _ {C : Category ℓC ℓC'} {D : Category ℓD ℓD'}
         (L : Functor C D) (R : Functor D C) where
  open UnitCounit
  open IsMonad
  open _⊣_
  open NatIso
  open Category
  open NatTrans
  open Functor

  MonadFromAdjunction : (L  R)  IsMonad (R ∘F L)
  η (MonadFromAdjunction L⊣R) =  L⊣R .η
  N-ob (μ (MonadFromAdjunction L⊣R)) c = R  L⊣R .ε  L  c   
  N-hom (μ (MonadFromAdjunction L⊣R)) f = (R ∘ʳ ((L⊣R .ε) ∘ˡ L)) .N-hom f
  idl-μ (MonadFromAdjunction L⊣R) =
    makeNatTransPathP
       i  F-rUnit i)
       i  funcComp R L)
      (funExt  c  L⊣R .Δ₂ (L  c )))
  idr-μ (MonadFromAdjunction L⊣R) =
    makeNatTransPathP
       i  F-lUnit i)
       i  funcComp R L)
      (funExt  c 
        compTrans (μ (MonadFromAdjunction L⊣R)) (funcComp R L ∘ʳ L⊣R .η) .N-ob c
          ≡⟨ refl 
        (funcComp R L)  L⊣R .η  c   ⋆⟨ C  R  L⊣R .ε  L  c   
          ≡⟨ sym (R .F-seq (L  L⊣R .η  c  ) (L⊣R .ε  L  c  )) 
        R  (L  L⊣R .η  c  ) ⋆⟨ D  (L⊣R .ε  L  c  ) 
          ≡⟨ ((λ i  R  L⊣R .Δ₁ c i )) 
        R  D .id 
          ≡⟨ R .F-id 
        C .id ))
  assoc-μ (MonadFromAdjunction L⊣R) =
    makeNatTransPathP
       i  F-assoc i)
       i  funcComp R L)
      (funExt  c 
        (funcComp R L)  R  L⊣R .ε  L  c    
          ⋆⟨ C  R  L⊣R .ε  L  c   
          ≡⟨ sym (R .F-seq (L  R  L⊣R .ε  L  c    )
             (L⊣R .ε  L  c  )) 
        R  (L  R  L⊣R .ε  L  c    ) ⋆⟨ D  (L⊣R .ε  L  c  ) 
          ≡⟨  i  R  L⊣R .ε .N-hom (L⊣R .ε .N-ob (L  c )) i ) 
        R  L⊣R .ε  L  funcComp R L  c    ⋆⟨ D  L⊣R .ε  L  c   
          ≡⟨ R .F-seq (L⊣R .ε  L  funcComp R L  c   )
            (L⊣R .ε  L  c  ) 
        R  L⊣R .ε  L  funcComp R L  c     ⋆⟨ C 
          R  L⊣R .ε  L  c    
      ))