import qualified Data.ByteString.Lazy as BS import Data.Csv import qualified Data.Map as M import Data.Map ((!)) import Text.Printf import Control.Arrow import qualified Data.Vector as V main = do file <- BS.readFile "dlist.csv" let Right (_ , rows) = decodeByName file let m = M.fromList $ map (\m -> (m ! "Name", read (m ! "Mean"))) $ V.toList rows :: M.Map String Double putStr "\\multicolumn{1}{|l|}{\\textsf{String}} " printf "& %3.0fms " (m ! "naive String, no Call Arity" * 1000) printf "& %3.0fms " (m ! "naive String" * 1000) printf "& %3.0fms " (m ! "naive String, exported 1" * 1000) printf "& %3.0fms " (m ! "naive String, exported 2" * 1000) putStrLn "\\\\" putStr "\\multicolumn{1}{|l|}{\\textsf{DList}} " printf "& %3.0fms " (m ! "DList, no CallArity" * 1000) printf "& %3.0fms " (m ! "DList" * 1000) printf "& %3.0fms " (m ! "DList, exported 1" * 1000) printf "& %3.0fms " (m ! "DList, exported 2" * 1000) putStrLn "\\\\" printf "%% %.1f%% \n" (((m ! "DList, no CallArity" / m ! "naive String, no Call Arity") - 1) * 100) printf "%% %.1f%% \n" (((m ! "DList" / m ! "naive String") - 1) * 100)