{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TupleSections #-}
module CsvParse (readResults) where
import qualified Data.Map.Strict as M
import Control.Applicative
import Data.Csv
import qualified Data.Vector as V
import qualified Data.ByteString.Lazy.Char8 as BSL
import Types
data BenchResult = BenchResult { benchName :: BenchName
, benchStats :: Stats
}
instance FromRecord BenchResult where
parseRecord v
| V.length v == 7 =
bench <$> v .! 0
<*> v .! 1
<*> v .! 2
<*> v .! 3
<*> v .! 4
<*> v .! 5
<*> v .! 6
| otherwise = empty
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 =
decode NoHeader
. BSL.unlines
. filter (not . ("Name,Mean" `BSL.isPrefixOf`))
. BSL.lines