module Main (main) where

import Control.Lens ((&), (.~))
import Criterion.Main
import qualified Data.ByteString as BS
import qualified Data.ByteString.Char8 as BS8
import qualified Data.ByteString.Lazy as LBS
import HaskellWorks.Data.Dsv.Lazy.Cursor (DsvCursor, makeCursor)

import Data.Sv
import qualified Data.Sv.Decode as D

opts :: ParseOptions
opts = defaultParseOptions & headedness .~ Unheaded

pd :: Decode' BS8.ByteString a -> DsvCursor -> DecodeValidation BS8.ByteString [a]
pd dec = parseDecodeFromDsvCursor dec opts

main :: IO ()
main =
  defaultMain
      [ bench "double" $ nf (pd D.double) doublesC
      , bench "read double" $ nf (pd (D.read :: Decode' BS.ByteString Double)) doublesC
      , bench "float" $ nf (pd D.float) doublesC
      , bench "read float" $ nf (pd (D.read :: Decode' BS.ByteString Float)) doublesC
      ]

doubles :: LBS.ByteString
doubles =
  LBS.fromStrict . BS.intercalate (BS8.singleton '\n') $
    fmap (BS8.pack . show) [0 :: Double, 1, 1.1102230246251565e-16, 7.845860130857695, 5000000000]

doublesC :: DsvCursor
doublesC = makeCursor 10 doubles