packages feed

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