packages feed

fibon-0.1.0: tools/fibon-analyse/Fibon/Analyse/Parse.hs

module Fibon.Analyse.Parse(
    GhcStats(..)
  , parseFibonResults
)
where

import qualified Data.Map        as M
import qualified Data.Text       as T
import qualified Data.Text.IO    as T
import Fibon.Result
import Fibon.Analyse.ExtraStats
import Fibon.Analyse.Result
import System.FilePath


parseFibonResults :: FilePath  -- ^ input file
                  -> IO (Maybe (M.Map ResultLabel [FibonResult])) -- ^ Result
parseFibonResults file = do
  input <- T.readFile file
  case runParser input of
    Nothing -> return Nothing
    Just [] -> return Nothing
    Just rs -> return (Just $ M.mapKeys addFileSource (groupResults rs))
  where
    baseName        = takeBaseName file
    addFileSource s = baseName ++ s

    runParser :: T.Text -> Maybe [FibonResult]
    runParser text = sequence (map parseLine (T.lines text))

    parseLine :: T.Text -> Maybe FibonResult
    parseLine line = 
      case reads (T.unpack line) of
        [(r, _)] -> Just r
        _        -> Nothing

groupResults :: [FibonResult] -> M.Map ResultLabel [FibonResult]
groupResults = foldr grouper M.empty
  where
  grouper   r = M.insertWith (++)  (benchType r) [r]
  benchType r = dropWhile (/= '-') (benchName r)