packages feed

moonlight-pale-0.1.0.0: bench/support/BenchSupport.hs

-- Shared benchmark scaffolding for @moonlight-pale@: size-parameterized groups
-- measured on prepared @Int@-indexed inputs, forced to normal form before timing.
module BenchSupport
  ( preparedBenchmarks,
  )
where

import Control.DeepSeq (NFData, force)
import Control.Exception (evaluate)
import Test.Tasty.Bench (Benchmark, bench, env, nf)

preparedBenchmarks ::
  (NFData input, NFData result) =>
  String ->
  [(Int, input)] ->
  (input -> result) ->
  [Benchmark]
preparedBenchmarks label preparedInputs workload =
  [ env (evaluate (force preparedInput)) $ \prepared ->
      bench (label <> "/" <> show size) (nf workload prepared)
    | (size, preparedInput) <- preparedInputs
  ]