-- | Functions to run outer layers of monadic stacks.
--
-- These are provided for convenience only; you can use the running
-- functions (like 'SL.runState') from the transformers' modules directly.
--
-- Note that reader and state runners have their arguments swapped around;
-- this makes it convenient to chain them.
module Control.Monad.Classes.Run
  ( -- * Identity
    run
    -- * Reader
  , runReader
    -- * State
  , runStateLazy
  , runStateStrict
  , evalStateLazy
  , evalStateStrict
  , execStateLazy
  , execStateStrict
    -- * Writer
  , runWriterLazy
  , runWriterStrict
  , evalWriterLazy
  , evalWriterStrict
  , execWriterLazy
  , execWriterStrict
  , evalWriterWith
  , mapWriter
  , CustomWriterT'(..)
  , CustomWriterT
    -- * Except
  , runExcept
  , runMaybe
    -- * Zoom
  , runZoom
  , ZoomT(..)
    -- * ReadState
  , ReadStateT(..)
  , runReadState
  ) where

import Data.Functor.Identity
import Control.Monad.Classes.Zoom
import Control.Monad.Classes.State
import Control.Monad.Classes.Writer
import Control.Monad.Classes.Reader
import Control.Monad.Classes.Except
import Control.Monad.Classes.ReadState

run :: Identity a -> a
run = runIdentity