{-# OPTIONS --safe #-}
module Prelude.Monad where

open import Prelude.Init

private variable x y : Type

record Monad (M : Type  Type ℓ′) : Set (1ℓ ⊔ₗ ℓ′) where
  field
    _>>=_ : M x -> (x -> M y) -> M y
    return : x -> M x

  _>>_ : M x -> M y -> M y
  m >> m' = m >>= λ _ -> m'

  when : Bool -> M  -> M 
  when cond act =
      if cond
      then act >> return _
      else return _

open Monad ⦃...⦄ public

instance
  Monad-List : Monad List
  Monad-List = record {Eff.RawMonad L.Eff.monad}