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 <> "\""