module Chapter3.IDesc.FreeMonad.IMonad where

open import Function

open import Chapter1.Logic

record RawIMonad {I : Set} (M : Pow I  Pow I) :
                 Set₁ where
  infixl 1 _>>=_ 
  infixr 1 _=<<_

  field
    return :  {A}  A  M A
    _>>=_  :  {A B i}  M A i  (A  M B)  M B i

  _=<<_ :  {i A B}  (A  M B)  M A i  M B i
  f =<< c = c >>= f

  join :  {i A}  M (M A) i  M A i
  join m = m >>= id