packages feed

hw-dsv-0.1.0.0: weigh/Space.hs

module Main where

import Data.ByteString (ByteString)
import Data.Vector     (Vector)
import Weigh

import qualified Data.ByteString.Lazy                as LBS
import qualified Data.Csv                            as CSV
import qualified Data.Vector                         as DV
import qualified HaskellWorks.Data.Dsv.Strict.Cursor as SVS

{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}

repeatedly :: (a -> Maybe a) -> a -> [a]
repeatedly f a = a:case f a of
  Just b  -> repeatedly f b
  Nothing -> []

loadCsv :: FilePath -> IO (DV.Vector (DV.Vector ByteString))
loadCsv filePath = do
  c <- SVS.mmapCursor ',' False filePath

  return $ SVS.toVectorVector c

main :: IO ()
main = do
  let infp  = "data/bench/data-0001000.csv"
  mainWith $ do
    setColumns [Case, Allocated, Max, Live, GCs]
    sequence_
      [ action "cassava/decode/Vector ByteString" $ do
          r <- fmap (CSV.decode CSV.HasHeader) (LBS.readFile infp) :: IO (Either String (Vector (Vector ByteString)))
          case r of
            Left _  -> error "Unexpected parse error"
            Right v -> pure v
      , action "hw-dsv/decode/Vector ByteString" $ do
          v <- loadCsv infp :: IO (Vector (Vector ByteString))
          pure v
      ]
  return ()