-- Computes averages of several benchmarks
--
-- Copyright (C) 2021-2025 Rudy Matela
-- Distributed under the 3-Clause BSD licence (see the file LICENSE).
import Data.List
import Data.Function
import Text.Printf
groupOn f = groupBy ((==) `on` f)
parseLine :: String -> (String,Double)
parseLine s = (n,t)
where
n = unwords $ init ws
t = read $ last ws
ws = words s
showLine :: (String,Double) -> String
showLine (s,x) = printf "%-25s %.2f" s x
collapseAvg :: [(String,Double)] -> (String,Double)
collapseAvg sxs = (fst $ head sxs, avg $ map snd sxs)
avg :: [Double] -> Double
avg xs = sum xs / fromIntegral (length xs)
io :: String -> String
io = unlines
. map showLine
. map collapseAvg
. groupOn fst
. map parseLine
. lines
main :: IO ()
main = interact io