packages feed

croaring-ffi-1.0: bench/Bench/Baseline.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE OverloadedRecordDot #-}

module Bench.Baseline (versus) where

import Data.List (intercalate)
import GHC.Records (HasField)
import Test.Tasty.Bench (Benchmark, Benchmarkable, bcompare, bench, bgroup)

versus :: (HasField "name" contender String) => [String] -> contender -> [contender] -> String -> (contender -> Benchmarkable) -> Benchmark
versus path baseline others operation select =
  bgroup operation $
    bench baseline.name (select baseline)
      : [bcompare baselinePattern . bench other.name $ select other | other <- others]
  where
    baselinePattern = intercalate " && " . zipWith field [0 :: Int ..] $ baseline.name : operation : path
    field 0 component = "$NF == \"" <> component <> "\""
    field depth component = "$(NF-" <> show depth <> ") == \"" <> component <> "\""