content: {-# LANGUAGE ScopedTypeVariables #-}
  
  module Instances.Integer
    ( benchmarks -- :: [Benchmark]
    ) where
  
  import           Criterion.Main
  import qualified Data.ByteString.Lazy   as BS
  import qualified Data.Vector            as Vector
  
  import           Codec.Serialise
  
  benchmarks :: [Benchmark]
  benchmarks =
    [ bgroup "serialise"
      [ bench "small positive" (nf goSerialise integerDataSmallPos)
      , bench "small negative" (nf goSerialise integerDataSmallNeg)
      , bench "large positive" (nf goSerialise integerDataLargePos)
      , bench "large negative" (nf goSerialise integerDataLargeNeg)
      ]
    , bgroup "deserialise"
      [ bench "small positive" (nf goDeserialise integerDataSerialisedSmallPos)
      , bench "small negative" (nf goDeserialise integerDataSerialisedSmallNeg)
      , bench "large positive" (nf goDeserialise integerDataSerialisedLargePos)
      , bench "large negative" (nf goDeserialise integerDataSerialisedLargeNeg)
      ]
    ]
    where
      goSerialise = BS.length . serialise
      goDeserialise :: BS.ByteString -> Vector.Vector Integer
      goDeserialise = deserialise
      integerDataSmallPos = Vector.replicate (100 :: Int) (10 :: Integer)
      integerDataSmallNeg = Vector.replicate (100 :: Int) (-10 :: Integer)
      integerDataLargePos = Vector.replicate (100 :: Int) (two^(two * 100))
      integerDataLargeNeg = Vector.replicate (100 :: Int) (-(two^(two * 100)))
      integerDataSerialisedSmallPos = serialise integerDataSmallPos
      integerDataSerialisedSmallNeg = serialise integerDataSmallNeg
      integerDataSerialisedLargePos = serialise integerDataLargePos
      integerDataSerialisedLargeNeg = serialise integerDataLargeNeg
      two = 2 :: Integer
  
  