content: {-# LANGUAGE OverloadedStrings #-}
  module Main (main) where
  
  import Codec.Xlsx
  import Codec.Xlsx.Parser.Stream
  import Codec.Xlsx.Writer.Stream
  import Control.DeepSeq
  import Control.Lens
  import Control.Monad (void)
  import Criterion.Main
  import qualified Data.ByteString as BS
  import qualified Data.ByteString.Lazy as LB
  import qualified Data.Conduit as C
  import qualified Data.Conduit.Combinators as C
  import Data.Maybe
  
  main :: IO ()
  main = do
    let filename = "data/testInput.xlsx"
          -- "data/6000.rows.x.26.cols.xlsx"
    bs <- BS.readFile filename
    let bs' = LB.fromStrict bs
        parsed :: Xlsx
        parsed = toXlsxFast bs'
    idx <- fmap (fromMaybe (error "ix not found")) $ runXlsxM filename $ makeIndexFromName "Sample list"
    items <- runXlsxM filename $ collectItems idx
    deepseq (parsed, bs', idx, items) (pure ())
    defaultMain
      [ bgroup
          "readFile"
          [ bench "with xlsx" $ nf toXlsx bs'
          , bench "with xlsx fast" $ nf toXlsxFast bs'
          , bench "with stream (counting)" $ nfIO $ runXlsxM filename $ countRowsInSheet idx
          , bench "with stream (reading)" $ nfIO $ runXlsxM filename $ readSheet idx (pure . rwhnf)
          ]
      , bgroup
          "writeFile"
          [ bench "with xlsx" $ nf (fromXlsx 0) parsed
          , bench "with stream (no sst)" $
            nfIO $ C.runConduit $
              void (writeXlsxWithSharedStrings defaultSettings mempty $ C.yieldMany $ view si_row <$> items)
              C..| C.fold
          , bench "with stream (sst)" $
            nfIO $ C.runConduit $
              void (writeXlsx defaultSettings $ C.yieldMany $ view si_row <$> items)
              C..| C.fold
          ]
      ]
  