packages feed

criterion-cmp-0.1.0.0: src/CsvParse.hs

{-# LANGUAGE FlexibleContexts  #-}
{-# LANGUAGE OverloadedStrings #-}

module CsvParse (readResults) where

import qualified Data.ByteString.Lazy as BSL
import qualified Data.Csv             as Csv
import qualified Data.Vector          as V

import Types

data BenchResult = BenchResult
    { _benchName  :: BenchName
    , _benchStats :: Stats
    }

instance Csv.FromNamedRecord BenchResult where
    parseNamedRecord m = bench
        <$> m Csv..: "Name"
        <*> m Csv..: "Mean"
        <*> m Csv..: "MeanLB"
        <*> m Csv..: "MeanUB"
        <*> m Csv..: "Stddev"
        <*> m Csv..: "StddevLB"
        <*> m Csv..: "StddevUB"
      where
        bench a b c d e f g = BenchResult a (Stats b c d e f g)

readResults :: FilePath -> IO [(BenchName, Stats)]
readResults fname = do
    mxs <- parseResults <$> BSL.readFile fname
    case mxs of
      Left err -> fail err
      Right xs -> return $ map (\(BenchResult a b) -> (a, b)) $ V.toList xs

parseResults :: BSL.ByteString -> Either String (V.Vector BenchResult)
parseResults = fmap snd . Csv.decodeByName