packages feed

fused-effects-1.0.2.0: benchmark/Bench/Reader.hs

{-# LANGUAGE TypeApplications #-}

module Bench.Reader
( benchmark
) where

import Control.Carrier.Reader
import Control.Monad

import Gauge hiding (benchmark)

asking :: Has (Reader Char) sig m => Int -> m ()
asking i = replicateM_ i (ask @Char)

locally :: Has (Reader Char) sig m => Int -> m ()
locally i = replicateM_ i (local @Char succ (ask @Char))

benchmark :: Gauge.Benchmark
benchmark = bgroup "Control.Carrier.Reader"
  [ bgroup "ask"
    [ bench "10" $ whnf (run . runReader 'a' . asking) 10
    , bench "100" $ whnf (run . runReader 'b' . asking) 100
    , bench "1000" $ whnf (run . runReader 'c' . asking) 1000
    ]
  , bgroup "local"
    [ bench "10" $ whnf (run . runReader 'a' . locally) 10
    , bench "100" $ whnf (run . runReader 'b' . locally) 100
    , bench "1000" $ whnf (run . runReader 'c' . locally) 1000
    ]
  ]