liquidhaskell-0.8.0.2: scripts/plot-benchmarks/src/Benchmark.hs
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleInstances #-}
module Benchmark where
import Data.Csv
import qualified Data.Map as Map
import Data.Foldable
import Data.Time.LocalTime
data Benchmark =
Benchmark { benchName :: String,
benchTimestamp :: LocalTime,
benchTime :: Double,
benchPass :: Bool
}
deriving (Eq)
instance Ord Benchmark where
compare lhs rhs = compare (benchTimestamp lhs) (benchTimestamp rhs)
unionAppend :: Map.Map String [Benchmark]
-> Map.Map String Benchmark
-> Map.Map String [Benchmark]
unionAppend l r = Map.unionWith (++) l r'
where
r' = fmap (\a -> [a]) r
toBenchMap :: (Foldable f)
=> f Benchmark
-> Map.Map String Benchmark
toBenchMap f = foldl' fn Map.empty f
where
fn m b = Map.insert (benchName b) b m
instance FromRecord Benchmark where
parseRecord r = Benchmark
<$> r .! 0
<*> pure (error ("Shouldn't be evaluated until after"
++ " reassignment!"))
<*> r .! 1
<*> do asStr <- r .! 2
return $ read asStr {- Since the test suite
generates this field by calling show, this read Should Be Safe (TM) -}
csvOutName = "Name"
csvOutDate = "Committer Date"
csvOutTime = "Time (Seconds)"
csvOutPass = "Success"
instance ToNamedRecord (LocalTime, Benchmark) where
toNamedRecord (_, bm) = namedRecord [csvOutName .= benchName bm,
csvOutDate .= (show $ benchTimestamp bm),
csvOutTime .= (benchTime bm),
csvOutPass .= (show $ benchPass bm)]