module Crypto.Lol.Benchmarks
(Crypto.Lol.Benchmarks.bench
,benchM
,benchIO
,benchGroup
,genBenchArgs
,Bench
,Benchmark
,NFData
,addGen) where
import Control.DeepSeq
import Control.Monad.Random
import Criterion as C
import Crypto.Lol.Utils.GenArgs
import Data.Proxy
addGen :: Proxy gen -> Proxy '(t,m,r) -> Proxy '(t,m,r,gen)
addGen _ _ = Proxy
bench :: NFData b => (a -> b) -> a -> Bench params
bench f = Bench . nf f
benchM :: (forall m . (MonadRandom m) => m (Bench a)) -> Bench a
benchM = BenchM
benchIO :: NFData b => IO b -> Bench params
benchIO = Bench . nfIO
benchGroup :: (Monad rnd) => String -> [rnd Benchmark] -> rnd Benchmark
benchGroup str = (bgroup str <$>) . sequence
genBenchArgs :: (GenArgs bnch, ResultOf bnch ~ Bench a, MonadRandom rnd)
=> String -> bnch -> Proxy a -> rnd Benchmark
genBenchArgs s f _ = (C.bench s . unbench) <$> genArgs f
unbench :: Bench a -> Benchmarkable
unbench (Bench x) = x
unbench (BenchM _) = error "cannot unbench BenchM"
data Bench params where
Bench :: Benchmarkable -> Bench a
BenchM :: (forall m . (MonadRandom m) => m (Bench a)) -> Bench a
instance GenArgs (Bench params) where
genArgs x@(Bench _) = return x
genArgs (BenchM x) = x