@@ -27,6 +27,7 @@ import Control.Monad (when)
2727import Control.Monad.IO.Class (MonadIO(..))
2828import Control.Monad.State.Strict (StateT, get, put, MonadState)
2929import qualified Control.Monad.State.Strict as State
30+import Control.Monad.Trans.Class (lift)
3031import Data.Functor.Identity (Identity, runIdentity)
3132import Data.IORef (newIORef, modifyIORef')
3233import GHC.Generics (Generic)
@@ -1610,8 +1611,11 @@ o_1_space_concat value = sqrtVal `seq`
16101611
16111612o_1_space_applicative :: Int -> [Benchmark]
16121613o_1_space_applicative value =
1613− [ bgroup "applicative"
1614− [ benchIO "outer product (sqrt n x sqrt n)" $ toNullAp value serially
1614+ [ bgroup "Applicative"
1615+ [ benchIO "(*>) (sqrt n x sqrt n)" $ apDiscardFst value serially
1616+ , benchIO "(<*) (sqrt n x sqrt n)" $ apDiscardSnd value serially
1617+ , benchIO "(<*>) (sqrt n x sqrt n)" $ toNullAp value serially
1618+ , benchIO "liftA2 (sqrt n x sqrt n)" $ apLiftA2 value serially
16151619 ]
16161620 ]
16171621
@@ -1636,16 +1640,17 @@ o_n_space_applicative value =
16361640o_1_space_monad :: Int -> [Benchmark]
16371641o_1_space_monad value =
16381642 [ bgroup "Monad"
1639− [ benchIO "outer product (sqrt n x sqrt n)" $ toNullM value serially
1640− , benchIO "outer product (sqrt n x sqrt n) (filterAllOut)" $
1643+ [ benchIO "(>>) (sqrt n x sqrt n)" $ monadThen value serially
1644+ , benchIO "(>>=) (sqrt n x sqrt n)" $ toNullM value serially
1645+ , benchIO "(>>=) (sqrt n x sqrt n) (filterAllOut)" $
16411646 filterAllOutM value serially
1642− , benchIO "outer product (sqrt n x sqrt n) (filterAllIn)" $
1647+ , benchIO "(>>=) (sqrt n x sqrt n) (filterAllIn)" $
16431648 filterAllInM value serially
1644− , benchIO "outer product (sqrt n x sqrt n) (filterSome)" $
1649+ , benchIO "(>>=) (sqrt n x sqrt n) (filterSome)" $
16451650 filterSome value serially
1646− , benchIO "outer product (sqrt n x sqrt n) (breakAfterSome)" $
1651+ , benchIO "(>>=) (sqrt n x sqrt n) (breakAfterSome)" $
16471652 breakAfterSome value serially
1648− , benchIO "outer product (cubert n x cubert n x cubert n)" $
1653+ , benchIO "(>>=) (cubert n x cubert n x cubert n)" $
16491654 toNullM3 value serially
16501655 ]
16511656 ]
@@ -1657,9 +1662,9 @@ o_n_space_monad value =
16571662 iterateSingleton ((>>) . pure) value
16581663 , benchIOSrc serially "(>>=) (n times)" $
16591664 iterateSingleton (\x xs -> xs >>= \y -> return (x + y)) value
1660− , benchIO "outer product (sqrt n x sqrt n) (toList)" $
1665+ , benchIO "(>>=) (sqrt n x sqrt n) (toList)" $
16611666 toListM value serially
1662− , benchIO "outer product (sqrt n x sqrt n) (toListSome)" $
1667+ , benchIO "(>>=) (sqrt n x sqrt n) (toListSome)" $
16631668 toListSome value serially
16641669 ]
16651670 ]
@@ -1714,10 +1719,10 @@ iterateStateIO n = do
17141719{-# INLINE iterateStateT #-}
17151720iterateStateT :: Int -> SerialT (StateT Int IO) Int
17161721iterateStateT n = do
1717− x <- get
1722+ x <- lift get
17181723 if x > n
17191724 then do
1720− put (x - 1)
1725+ lift $ put (x - 1)
17211726 iterateStateT n
17221727 else return x
17231728
@@ -1734,8 +1739,8 @@ iterateState n = do
17341739 iterateState n
17351740 else return x
17361741
1737−o_n_space_transformer :: Int -> [Benchmark]
1738−o_n_space_transformer value =
1742+o_n_heap_transformer :: Int -> [Benchmark]
1743+o_n_heap_transformer value =
17391744 [ bgroup "transformer"
17401745 [ benchIO "StateT Int IO (n times) (baseline)" $ \n ->
17411746 State.evalStateT (iterateStateIO n) value
@@ -1805,6 +1810,7 @@ main = do
18051810
18061811 -- transformation
18071812 , o_n_heap_reordering size
1813+ , o_n_heap_transformer size
18081814 ]
18091815 , bgroup (o_n_space_prefix moduleName) $ Prelude.concat
18101816 [ o_n_space_elimination_foldable size
@@ -1819,6 +1825,5 @@ main = do
18191825 , o_n_space_functor size
18201826 , o_n_space_applicative size
18211827 , o_n_space_monad size
1822− , o_n_space_transformer size
18231828 ]
18241829 ]