|
Packit |
1d883e |
{-# LANGUAGE DeriveDataTypeable, RankNTypes #-}
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
module Main where
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
--------------------------------------------------------------------------------
|
|
Packit |
1d883e |
-- Imports
|
|
Packit |
1d883e |
--------------------------------------------------------------------------------
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from base:
|
|
Packit |
1d883e |
import Prelude hiding (catch)
|
|
Packit |
1d883e |
import Control.Exception ( Exception, SomeException, throwIO )
|
|
Packit |
1d883e |
import qualified Control.Exception as E ( mask, bracket, bracket_ )
|
|
Packit |
1d883e |
import Data.Typeable
|
|
Packit |
1d883e |
import Control.Monad (join)
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from criterion:
|
|
Packit |
1d883e |
import Criterion.Main
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from transformers:
|
|
Packit |
1d883e |
import Control.Monad.IO.Class
|
|
Packit |
1d883e |
import Control.Monad.Trans.Maybe
|
|
Packit |
1d883e |
import Control.Monad.Trans.Reader
|
|
Packit |
1d883e |
import Control.Monad.Trans.State
|
|
Packit |
1d883e |
import Control.Monad.Trans.Writer
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from monad-peel:
|
|
Packit |
1d883e |
import qualified Control.Exception.Peel as MP
|
|
Packit |
1d883e |
import qualified Control.Monad.IO.Peel as MP
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from monad-control:
|
|
Packit |
1d883e |
import qualified Control.Monad.Trans.Control as MC
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
-- from lifted-base:
|
|
Packit |
1d883e |
import qualified Control.Exception.Lifted as MC
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
--------------------------------------------------------------------------------
|
|
Packit |
1d883e |
-- Main
|
|
Packit |
1d883e |
--------------------------------------------------------------------------------
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
main :: IO ()
|
|
Packit |
1d883e |
main = defaultMain
|
|
Packit |
1d883e |
[ b "bracket" benchBracket MP.bracket MC.bracket
|
|
Packit |
1d883e |
, b "bracket_" benchBracket_ MP.bracket_ MC.bracket_
|
|
Packit |
1d883e |
, b "catch" benchCatch MP.catch MC.catch
|
|
Packit |
1d883e |
, b "try" benchTry MP.try MC.try
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
, bgroup "mask"
|
|
Packit |
1d883e |
[ bench "monad-peel" $ whnfIO $ benchMask mpMask
|
|
Packit |
1d883e |
, bench "monad-control" $ whnfIO $ benchMask MC.mask
|
|
Packit |
1d883e |
]
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
, bgroup "liftIOOp"
|
|
Packit |
1d883e |
[ bench "monad-peel" $ whnfIO $ exe $ MP.liftIOOp (E.bracket nop (\_ -> nop))
|
|
Packit |
1d883e |
(\_ -> nop)
|
|
Packit |
1d883e |
, bench "monad-control" $ whnfIO $ exe $ MC.liftBaseOp (E.bracket nop (\_ -> nop))
|
|
Packit |
1d883e |
(\_ -> nop)
|
|
Packit |
1d883e |
]
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
, bgroup "liftIOOp_"
|
|
Packit |
1d883e |
[ bench "monad-peel" $ whnfIO $ exe $ MP.liftIOOp_ (E.bracket_ nop nop) nop
|
|
Packit |
1d883e |
, bench "monad-control" $ whnfIO $ exe $ MC.liftBaseOp_ (E.bracket_ nop nop) nop
|
|
Packit |
1d883e |
]
|
|
Packit |
1d883e |
]
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
b name bnch peel mndCtrl = bgroup name
|
|
Packit |
1d883e |
[ bench "monad-peel" $ whnfIO $ bnch peel
|
|
Packit |
1d883e |
, bench "monad-control" $ whnfIO $ bnch mndCtrl
|
|
Packit |
1d883e |
]
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
--------------------------------------------------------------------------------
|
|
Packit |
1d883e |
-- Monad stack
|
|
Packit |
1d883e |
--------------------------------------------------------------------------------
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
type M a = ReaderT Int (StateT Bool (WriterT String (MaybeT IO))) a
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
type R a = IO (Maybe ((a, Bool), String))
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
runM :: Int -> Bool -> M a -> R a
|
|
Packit |
1d883e |
runM r s m = runMaybeT (runWriterT (runStateT (runReaderT m r) s))
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
exe :: M a -> R a
|
|
Packit |
1d883e |
exe = runM 0 False
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
--------------------------------------------------------------------------------
|
|
Packit |
1d883e |
-- Benchmarks
|
|
Packit |
1d883e |
--------------------------------------------------------------------------------
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
benchBracket bracket = exe $ bracket nop (\_ -> nop) (\_ -> nop)
|
|
Packit |
1d883e |
benchBracket_ bracket_ = exe $ bracket_ nop nop nop
|
|
Packit |
1d883e |
benchCatch catch = exe $ catch throwE (\E -> nop)
|
|
Packit |
1d883e |
benchTry try = exe $ try throwE :: R (Either E ())
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
benchMask :: (((forall a. M a -> M a) -> M ()) -> M ()) -> R ()
|
|
Packit |
1d883e |
benchMask mask = exe $ mask $ \restore -> nop >> restore nop >> nop
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
--------------------------------------------------------------------------------
|
|
Packit |
1d883e |
-- Utils
|
|
Packit |
1d883e |
--------------------------------------------------------------------------------
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
nop :: Monad m => m ()
|
|
Packit |
1d883e |
nop = return ()
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
data E = E deriving (Show, Typeable)
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
instance Exception E
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
throwE :: MonadIO m => m ()
|
|
Packit |
1d883e |
throwE = liftIO $ throwIO E
|
|
Packit |
1d883e |
|
|
Packit |
1d883e |
mpMask :: MP.MonadPeelIO m => ((forall a. m a -> m a) -> m b) -> m b
|
|
Packit |
1d883e |
mpMask f = do
|
|
Packit |
1d883e |
k <- MP.peelIO
|
|
Packit |
1d883e |
join $ liftIO $ E.mask $ \restore -> k $ f $ MP.liftIOOp_ restore
|