packages feed

llvm-general-3.3.0.0: src/Control/Monad/Phased.hs

{-# LANGUAGE
  FlexibleInstances,
  MultiParamTypeClasses,
  UndecidableInstances
  #-}
module Control.Monad.Phased (
  MonadPhased(..),
  PhasedT(..),
  runPhasedT,
  forInterleavedM,
  iap,
  defer,
  runInterleaved,
  mapPhasedT
  ) where

import Control.Monad
import Control.Monad.Trans.Phased

import Control.Monad.Trans.Class
import Control.Monad.State.Class
import Control.Monad.Reader.Class
import Control.Monad.Error.Class
import Control.Monad.Phased.Class

instance MonadState s m => MonadState s (PhasedT m) where
  state = lift . state

instance MonadReader r m => MonadReader r (PhasedT m) where
  ask = lift ask
  local f = PhasedT . local f . liftM (either (Left . local f) Right) . unPhasedT

instance (MonadError e m) => MonadError e (PhasedT m) where
  throwError = lift . throwError
  catchError pa ph = mapPhasedT (`catchError` (unPhasedT . ph)) pa