packages feed

ether-0.5.0.0: bench/Bench.hs

{-# OPTIONS -fno-warn-partial-type-signatures #-}

module Main (main) where

import Control.DeepSeq
import qualified Control.Lens as L
import qualified Control.Monad.Reader as M
import qualified Control.Monad.State as M
import Criterion.Main
import Ether

id' :: a -> a
id' = id
{-# NOINLINE id' #-}

readerCombinerMTL_flat_9
  :: M.MonadReader (Int, Int, Int, Int, Int, Int, Int, Int, Int) m
  => m ()
readerCombinerMTL_flat_9 = do
  rnf <$> sequenceA
    [ L.view L._1
    , L.view L._2
    , L.view L._3
    , L.view L._4
    , L.view L._5
    , L.view L._6
    , L.view L._7
    , L.view L._8
    , L.view L._9 ]
{-# NOINLINE readerCombinerMTL_flat_9 #-}

stateCombinerMTL_flat_9
  :: M.MonadState (Int, Int, Int, Int, Int, Int, Int, Int, Int) m
  => m ()
stateCombinerMTL_flat_9 = do
  M.modify (L.over L._1 id')
  M.modify (L.over L._2 id')
  M.modify (L.over L._3 id')
  M.modify (L.over L._4 id')
  M.modify (L.over L._5 id')
  M.modify (L.over L._6 id')
  M.modify (L.over L._7 id')
  M.modify (L.over L._8 id')
  M.modify (L.over L._9 id')
  rnf <$> sequenceA
    [ L.use L._1
    , L.use L._2
    , L.use L._3
    , L.use L._4
    , L.use L._5
    , L.use L._6
    , L.use L._7
    , L.use L._8
    , L.use L._9 ]
{-# NOINLINE stateCombinerMTL_flat_9 #-}

run_readerCombinerMTL_flat_9 :: (Int, Int, Int, Int, Int, Int, Int, Int, Int) -> ()
run_readerCombinerMTL_flat_9
  (a1, a2, a3, a4, a5, a6, a7, a8, a9) =
    M.runReader readerCombinerMTL_flat_9 (a9, a8, a7, a6, a5, a4, a3, a2, a1)

run_stateCombinerMTL_flat_9 ::
  (Int, Int, Int, Int, Int, Int, Int, Int, Int) ->
    ((), (Int, Int, Int, Int, Int, Int, Int, Int, Int))
run_stateCombinerMTL_flat_9
  (a1, a2, a3, a4, a5, a6, a7, a8, a9) =
    M.runState stateCombinerMTL_flat_9 (a9, a8, a7, a6, a5, a4, a3, a2, a1)

readerCombinerEther_sep_9
  :: ( MonadReader 1 Int m
     , MonadReader 2 Int m
     , MonadReader 3 Int m
     , MonadReader 4 Int m
     , MonadReader 5 Int m
     , MonadReader 6 Int m
     , MonadReader 7 Int m
     , MonadReader 8 Int m
     , MonadReader 9 Int m )
    => m ()
readerCombinerEther_sep_9 = rnf <$> sequenceA
  [ ask @1
  , ask @2
  , ask @3
  , ask @4
  , ask @5
  , ask @6
  , ask @7
  , ask @8
  , ask @9 ]
{-# NOINLINE readerCombinerEther_sep_9 #-}

stateCombinerEther_sep_9
  :: ( MonadState 1 Int m
     , MonadState 2 Int m
     , MonadState 3 Int m
     , MonadState 4 Int m
     , MonadState 5 Int m
     , MonadState 6 Int m
     , MonadState 7 Int m
     , MonadState 8 Int m
     , MonadState 9 Int m )
    => m ()
stateCombinerEther_sep_9 = do
  modify @1 id'
  modify @2 id'
  modify @3 id'
  modify @4 id'
  modify @5 id'
  modify @6 id'
  modify @7 id'
  modify @8 id'
  modify @9 id'
  rnf <$> sequenceA
    [ get @1
    , get @2
    , get @3
    , get @4
    , get @5
    , get @6
    , get @7
    , get @8
    , get @9 ]
{-# NOINLINE stateCombinerEther_sep_9 #-}

run_readerCombinerEther_nested_9 :: (Int, Int, Int, Int, Int, Int, Int, Int, Int) -> ()
run_readerCombinerEther_nested_9
  (a1, a2, a3, a4, a5, a6, a7, a8, a9)
    = flip (runReader  @9) a1
    . flip (runReaderT @8) a2
    . flip (runReaderT @7) a3
    . flip (runReaderT @6) a4
    . flip (runReaderT @5) a5
    . flip (runReaderT @4) a6
    . flip (runReaderT @3) a7
    . flip (runReaderT @2) a8
    . flip (runReaderT @1) a9
    $ readerCombinerEther_sep_9

run_readerCombinerEther_flatten_9 :: (Int, Int, Int, Int, Int, Int, Int, Int, Int) -> ()
run_readerCombinerEther_flatten_9
  (a1, a2, a3, a4, a5, a6, a7, a8, a9)
    =
      runReaders
        readerCombinerEther_sep_9
          ( Tagged @1 a9,
            Tagged @2 a8,
            Tagged @3 a7,
            Tagged @4 a6,
            Tagged @5 a5,
            Tagged @6 a4,
            Tagged @7 a3,
            Tagged @8 a2,
            Tagged @9 a1 )

run_readerCombinerEther_flattenhalf_9 :: (Int, Int, Int, Int, Int, Int, Int, Int, Int) -> ()
run_readerCombinerEther_flattenhalf_9
  (a1, a2, a3, a4, a5, a6, a7, a8, a9) =
    flip runReaders
      ( Tagged @1 a9,
        Tagged @2 a8,
        Tagged @3 a7,
        Tagged @4 a6 ) .
    flip runReadersT
      ( Tagged @5 a5,
        Tagged @6 a4,
        Tagged @7 a3,
        Tagged @8 a2,
        Tagged @9 a1 ) $
    readerCombinerEther_sep_9

run_stateCombinerEther_flatten_9 ::
  (Int, Int, Int, Int, Int, Int, Int, Int, Int) ->
    ((), _)
run_stateCombinerEther_flatten_9
  (a1, a2, a3, a4, a5, a6, a7, a8, a9)
    =
      runStates
        stateCombinerEther_sep_9
          ( Tagged @1 a9,
            Tagged @2 a8,
            Tagged @3 a7,
            Tagged @4 a6,
            Tagged @5 a5,
            Tagged @6 a4,
            Tagged @7 a3,
            Tagged @8 a2,
            Tagged @9 a1 )

tuple_9 :: (Int, Int, Int, Int, Int, Int, Int, Int, Int)
tuple_9 = (1, -2, 3, -4, 5, -6, 7, -8, 9)

main :: IO ()
main = do
  defaultMain
    [ bench "readerCombinerMTL_flat_9" $ nf run_readerCombinerMTL_flat_9 tuple_9
    , bench "readerCombinerEther_nested_9" $ nf run_readerCombinerEther_nested_9 tuple_9
    , bench "readerCombinerEther_flatten_9" $ nf run_readerCombinerEther_flatten_9 tuple_9
    , bench "readerCombinerEther_flattenhalf_9" $
        nf run_readerCombinerEther_flattenhalf_9 tuple_9
    , bench "stateCombinerMTL_flat_9" $ nf run_stateCombinerMTL_flat_9 tuple_9
    , bench "stateCombinerEther_flatten_9" $ nf run_stateCombinerEther_flatten_9 tuple_9
    ]