module Monad
  ( -- * Monad
    Monad((>>=), return)
  , (=<<)
  , (>=>)
  , (<=<)
  , (<$!>)
  , join
  , loopM
  , unlessM
  , whenJustM
  , whenM
  , whileM
    -- ** Newtypes
  , Kleisli(..)
    -- * MMonad
  , MMonad(..)
  , squash
  , (>|>)
  , (<|<)
  , (=<|)
  , (|>=)
  ) where

import Control.Arrow       (Kleisli(Kleisli, runKleisli))
import Control.Monad       (Monad(return, (>>=)), join, (<$!>), (<=<), (=<<),
                            (>=>))
import Control.Monad.Extra (loopM, unlessM, whenJustM, whenM, whileM)
import Control.Monad.Morph (MMonad(embed), squash, (<|<), (=<|), (>|>), (|>=))