{-# LANGUAGE BangPatterns #-}
module Main (main) where
import Prelude hiding (print, readFile)
import Data.Text.IO (readFile, hPutStr)
import Control.Monad (forM_, when)
import Data.List (foldl1', isPrefixOf, partition)
import Data.Tuple (swap)
import Data.Monoid (Last(..), mconcat)
import System.Environment (getArgs)
import System.Exit (exitSuccess)
import System.FilePath (replaceExtension)
import System.IO (withFile, IOMode(WriteMode))
import Args (args, Args(..), Uniform(..), Sort(..))
import Total (total)
import Prune (prune, cmpName, cmpSize, cmpStdDev)
import Bands (bands)
import Pretty (pretty)
import Print (print)
import SVG (svg)
import Types (Header(..))
main :: IO ()
main = do
a <- args
let uniformTime = uniformity a `elem` [Time, Both]
uniformMemory = uniformity a `elem` [Memory, Both]
sorting' = case sorting a of
Name -> cmpName
Size -> cmpSize
StdDev -> cmpStdDev
reversing' = if reversing a then swap else id
cmp = fst $ reversing' sorting'
when (null (files a)) exitSuccess
if not (uniformTime || uniformMemory)
then forM_ (files a) $ \file -> do
input <- readFile file
let (header, totals) = total input
keeps = prune cmp (tracePercent a) (bound $ nBands a) totals
(times, vals) = bands header keeps input
((sticks, vticks), (labels, coords)) = pretty header vals keeps
outputs = print svg (patterned a) header sticks vticks labels times coords
withFile (replaceExtension file "svg") WriteMode $ \h -> mapM_ (hPutStr h) outputs
else do
inputs <- mapM readFile (files a)
let hts0 = map total inputs
(smima, vmima) = foldl1' (\((!smi, !sma), (!vmi, !vma)) ((!smi', !sma'), (!vmi', !vma')) -> ((smi`min`smi', sma`max`sma'), (vmi`min`vmi', vma`max`vma'))) . map (\(h, _) -> (hSampleRange h, hValueRange h)) $ hts0
hts1 | uniformTime = map (\(h, t) -> (h{ hSampleRange = smima }, t)) hts0
| otherwise = hts0
hts | uniformMemory = map (\(h, t) -> (h{ hValueRange = vmima }, t)) hts1
| otherwise = hts1
forM_ (zip3 (files a) inputs hts) $ \(file, input, (header, totals)) -> do
let keeps = prune cmp (tracePercent a) (bound $ nBands a) totals
(times, vals) = bands header keeps input
((sticks, vticks), (labels, coords)) = pretty header vals keeps
outputs = print svg (patterned a) header sticks vticks labels times coords
withFile (replaceExtension file "svg") WriteMode $ \h -> mapM_ (hPutStr h) outputs
bound :: Int -> Int
bound n
| n <= 0 = maxBound
| otherwise = n