open import Level
open import Categories.Category.Core
open import Categories.Category.Cartesian
open import Categories.Category.BinaryProducts
open import Categories.Monad hiding (id)
open import Categories.Monad.Strong
open import Categories.Monad.Commutative
open import Categories.Category.Cartesian.Monoidal
open import Categories.Category.Cartesian.SymmetricMonoidal
open import Categories.Category.Monoidal.Symmetric using (Symmetric)

import Categories.Monad.Strong.Properties as StrongProps

module Monad.EquationalLifting {o  e} {C : Category o  e} (cartesian : Cartesian C) where
  open Category C
  open Cartesian cartesian using (products)
  open BinaryProducts products
  open CartesianMonoidal cartesian using (monoidal)
  open Symmetric (symmetric C cartesian) using (braided)


  EquationalLifting :  (CM : CommutativeMonad braided)  Set (o  e)
  EquationalLifting CM =  {X}  τ.η _  Δ {M.F.₀ X}  M.F.₁  M.η.η X , id 
    where
      open CommutativeMonad CM
      module τ = strengthen

  record EquationalLiftingMonad : Set (o    e)
    where
      field
        commutativeMonad : CommutativeMonad braided
        equationalLifting : EquationalLifting commutativeMonad

      open CommutativeMonad commutativeMonad public
      open StrongProps.Right.Shorthands rightStrength public
      open StrongProps.Left.Shorthands strength public