module Data.MessagePack.IntBench (suite) where

import           Criterion.Main       (Benchmark, bench, bgroup, nf)
import qualified Data.ByteString.Lazy as LBS
import           Data.Int             (Int64)

import           Data.MessagePack


packInt :: Int64 -> LBS.ByteString
packInt = pack

unpackInt :: LBS.ByteString -> Maybe Int64
unpackInt = unpack


suite :: [Benchmark]
suite =
  [ bgroup "pack" -- should be constant time
    [ bench "0x1"                 $ nf packInt   0x1
    , bench "0x10"                $ nf packInt   0x10
    , bench "0x100"               $ nf packInt   0x100
    , bench "0x1000"              $ nf packInt   0x1000
    , bench "0x10000"             $ nf packInt   0x10000
    , bench "0x100000"            $ nf packInt   0x100000
    , bench "0x1000000"           $ nf packInt   0x1000000
    , bench "0x10000000"          $ nf packInt   0x10000000
    , bench "0x100000000"         $ nf packInt   0x100000000
    , bench "0x1000000000"        $ nf packInt   0x1000000000
    , bench "0x10000000000"       $ nf packInt   0x10000000000
    , bench "0x100000000000"      $ nf packInt   0x100000000000
    , bench "0x1000000000000"     $ nf packInt   0x1000000000000
    , bench "0x10000000000000"    $ nf packInt   0x10000000000000
    , bench "0x100000000000000"   $ nf packInt   0x100000000000000
    , bench "0x1000000000000000"  $ nf packInt   0x1000000000000000
    , bench "-0x1"                $ nf packInt (-0x1               )
    , bench "-0x10"               $ nf packInt (-0x10              )
    , bench "-0x100"              $ nf packInt (-0x100             )
    , bench "-0x1000"             $ nf packInt (-0x1000            )
    , bench "-0x10000"            $ nf packInt (-0x10000           )
    , bench "-0x100000"           $ nf packInt (-0x100000          )
    , bench "-0x1000000"          $ nf packInt (-0x1000000         )
    , bench "-0x10000000"         $ nf packInt (-0x10000000        )
    , bench "-0x100000000"        $ nf packInt (-0x100000000       )
    , bench "-0x1000000000"       $ nf packInt (-0x1000000000      )
    , bench "-0x10000000000"      $ nf packInt (-0x10000000000     )
    , bench "-0x100000000000"     $ nf packInt (-0x100000000000    )
    , bench "-0x1000000000000"    $ nf packInt (-0x1000000000000   )
    , bench "-0x10000000000000"   $ nf packInt (-0x10000000000000  )
    , bench "-0x100000000000000"  $ nf packInt (-0x100000000000000 )
    , bench "-0x1000000000000000" $ nf packInt (-0x1000000000000000)
    ]
  , bgroup "unpack" -- should be constant time
    [ bench "0x1"                 $ nf unpackInt (packInt   0x1                )
    , bench "0x10"                $ nf unpackInt (packInt   0x10               )
    , bench "0x100"               $ nf unpackInt (packInt   0x100              )
    , bench "0x1000"              $ nf unpackInt (packInt   0x1000             )
    , bench "0x10000"             $ nf unpackInt (packInt   0x10000            )
    , bench "0x100000"            $ nf unpackInt (packInt   0x100000           )
    , bench "0x1000000"           $ nf unpackInt (packInt   0x1000000          )
    , bench "0x10000000"          $ nf unpackInt (packInt   0x10000000         )
    , bench "0x100000000"         $ nf unpackInt (packInt   0x100000000        )
    , bench "0x1000000000"        $ nf unpackInt (packInt   0x1000000000       )
    , bench "0x10000000000"       $ nf unpackInt (packInt   0x10000000000      )
    , bench "0x100000000000"      $ nf unpackInt (packInt   0x100000000000     )
    , bench "0x1000000000000"     $ nf unpackInt (packInt   0x1000000000000    )
    , bench "0x10000000000000"    $ nf unpackInt (packInt   0x10000000000000   )
    , bench "0x100000000000000"   $ nf unpackInt (packInt   0x100000000000000  )
    , bench "0x1000000000000000"  $ nf unpackInt (packInt   0x1000000000000000 )
    , bench "-0x1"                $ nf unpackInt (packInt (-0x1               ))
    , bench "-0x10"               $ nf unpackInt (packInt (-0x10              ))
    , bench "-0x100"              $ nf unpackInt (packInt (-0x100             ))
    , bench "-0x1000"             $ nf unpackInt (packInt (-0x1000            ))
    , bench "-0x10000"            $ nf unpackInt (packInt (-0x10000           ))
    , bench "-0x100000"           $ nf unpackInt (packInt (-0x100000          ))
    , bench "-0x1000000"          $ nf unpackInt (packInt (-0x1000000         ))
    , bench "-0x10000000"         $ nf unpackInt (packInt (-0x10000000        ))
    , bench "-0x100000000"        $ nf unpackInt (packInt (-0x100000000       ))
    , bench "-0x1000000000"       $ nf unpackInt (packInt (-0x1000000000      ))
    , bench "-0x10000000000"      $ nf unpackInt (packInt (-0x10000000000     ))
    , bench "-0x100000000000"     $ nf unpackInt (packInt (-0x100000000000    ))
    , bench "-0x1000000000000"    $ nf unpackInt (packInt (-0x1000000000000   ))
    , bench "-0x10000000000000"   $ nf unpackInt (packInt (-0x10000000000000  ))
    , bench "-0x100000000000000"  $ nf unpackInt (packInt (-0x100000000000000 ))
    , bench "-0x1000000000000000" $ nf unpackInt (packInt (-0x1000000000000000))
    ]
  ]