fibon-0.2.0: tools/fibon-analyse/Fibon/Analyse/AnalysisRoutines.hs
module Fibon.Analyse.AnalysisRoutines(
noAnalysis
, ghcStatsAnalysis
, Analysis(..)
)
where
import Data.ByteString(ByteString)
import Fibon.Result
import Fibon.Analyse.ExtraStats
import Fibon.Analyse.Metrics
import Fibon.Analyse.Parse
import Fibon.Analyse.Result
data Analysis a = Analysis {
fibonAnalysis :: (FibonResult -> IO FibonStats)-- ^ RunData analyser
, extraParser :: (ByteString -> Maybe a) -- ^ extraStats parser
, extraAnalysis :: ([a] -> IO a) -- ^ extraStats analyser
}
noAnalysis :: Analysis a
noAnalysis = Analysis {
fibonAnalysis = return . getStats
, extraParser = const Nothing
, extraAnalysis = return . head
}
where
getStats fr = FibonStats {
compileTime = Single $ ExecTime ((buildTime . buildData) fr)
, binarySize = Single $ getSize (sizeData fr)
, wallTime = Single $ ExecTime ((meanTime . summary . runData) fr)
}
getSize s = maybe (MemSize 0) MemSize (parseBinarySize s)
sizeData = buildSize . buildData
ghcStatsAnalysis :: Analysis GhcStats
ghcStatsAnalysis = noAnalysis {
extraParser = parseGhcStats
, extraAnalysis = return . ghcStatsSummary
}
--TODO: make extraAnalysis for GhcStats acutally do some analysis
--makeAnalysis :: Analysis a -> (String -> Maybe b) -> Analysis b