content: {-|
  Module      : Crypto.Lol.Utils.Benchmarks
  Description : Infrastructure for benchmarking Lol.
  Copyright   : (c) Eric Crockett, 2011-2017
                    Chris Peikert, 2011-2017
  License     : GPL-3
  Maintainer  : ecrockett0@email.com
  Stability   : experimental
  Portability : POSIX
  
  Infrastructure for benchmarking Lol.
  -}
  
  {-# LANGUAGE DataKinds             #-}
  {-# LANGUAGE FlexibleContexts      #-}
  {-# LANGUAGE FlexibleInstances     #-}
  {-# LANGUAGE GADTs                 #-}
  {-# LANGUAGE MultiParamTypeClasses #-}
  {-# LANGUAGE PolyKinds             #-}
  {-# LANGUAGE RankNTypes            #-}
  {-# LANGUAGE ScopedTypeVariables   #-}
  {-# LANGUAGE TypeFamilies          #-}
  
  module Crypto.Lol.Utils.Benchmarks
  (mkBench, mkBenchIO
  -- Re-exports
  ,C.bgroup, C.Benchmark) where
  
  import Control.DeepSeq
  
  import qualified Criterion as C
  
  -- | Make a `Benchmark` from a function and its input
  mkBench :: NFData b => String -> (a -> b) -> a -> C.Benchmark
  mkBench name f input = C.bench name $ C.nf f input
  
  -- | Make a `Benchmark` from an IO function and its input
  mkBenchIO :: NFData b => String -> IO b -> C.Benchmark
  mkBenchIO name i = C.bench name $ C.nfIO i
  