{-# OPTIONS --cubical #-}

open import MndContainer as MC
open import CategoryTheory
open import ContainersPlus

open import Level renaming (suc to lsuc ; zero to lzero)
open import Function
open import Cubical.Data.Sigma
open import Cubical.Foundations.Prelude hiding (_▷_)
open import Cubical.HITs.PropositionalTruncation


module _ where

module MndContainerToMonad {ℓs ℓp : Level} (S : Set ℓs) (P : S  Set ℓp)
                           (MCon : MndContainer ℓs ℓp (S  P)) where

  open MC.MndContainer MCon hiding (S ; P)
  open MC.IsMndContainer isMndContainer
  open _⇒_
  open Monad

  monad : Monad (ℓs  ℓp) (ℓs  ℓp)  S  P ⟧f
  α (η monad) X x = (ι , const x)
  nat (η monad) X Y f =  refl ∣₁
  α (μ monad) X (s , f) = (σ s (fst  f) , λ p  snd (f (pr₁ _ _ p)) (pr₂ _ _ p))
  nat (μ monad) X Y f =  refl ∣₁
  μ-unit-l monad i X (s , f) = (unit-l s i , λ p  f (pr-unit-l i p))
  μ-unit-r monad i X (s , f) = (unit-r s i , λ p  f (pr-unit-r i p))
  μ-assoc monad i X (s , f) = (assoc s (fst  f)  p p'  fst (snd (f p) p')) i 
                              , λ p  snd (snd (f (pr-mul₁ i p)) (pr-mul₁₂ i p)) (pr-mul₂₂ i p))