{-# LANGUAGE BangPatterns #-}
module Main (main) where
import Prelude hiding (print, readFile)
import Data.ByteString.Char8 (readFile, hPutStr)
import Control.Monad (forM_, when)
import Data.List (foldl1', isPrefixOf, partition)
import Data.Monoid (Last(..), mconcat)
import System.Environment (getArgs)
import System.Exit (exitSuccess)
import System.FilePath (replaceExtension)
import System.IO (withFile, IOMode(WriteMode))
import Total (total)
import Prune (prune)
import Bands (bands)
import Pretty (pretty)
import Print (print)
import SVG (svg)
import Types (Header(..))
main :: IO ()
main = do
args <- getArgs
let (flags, files) = partition (isPrefixOf "--") args
uniformity "--uniform-scale=none" = Last (Just (False, False))
uniformity "--uniform-scale=time" = Last (Just (True, False))
uniformity "--uniform-scale=memory" = Last (Just (False, True))
uniformity "--uniform-scale=both" = Last (Just (True, True))
uniformity _ = Last Nothing
Last (Just (uniformTime, uniformMemory)) = mconcat (Last (Just (False, False)) : map uniformity flags)
when (null files) exitSuccess
if not (uniformTime || uniformMemory)
then forM_ files $ \file -> do
input <- readFile file
let (header, totals) = total input
keeps = prune totals
(times, vals) = bands header keeps input
((sticks, vticks), (labels, coords)) = pretty header vals keeps
outputs = print svg header sticks vticks labels times coords
withFile (replaceExtension file "svg") WriteMode $ \h -> mapM_ (hPutStr h) outputs
else do
inputs <- mapM readFile files
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 inputs hts) $ \(file, input, (header, totals)) -> do
let keeps = prune totals
(times, vals) = bands header keeps input
((sticks, vticks), (labels, coords)) = pretty header vals keeps
outputs = print svg header sticks vticks labels times coords
withFile (replaceExtension file "svg") WriteMode $ \h -> mapM_ (hPutStr h) outputs