content: module Mini
    ( benchmarks -- :: [Benchmark]
    ) where
  import           System.FilePath
  
  import           Criterion.Main
  import qualified Data.ByteString        as B
  import qualified Data.ByteString.Lazy   as BS
  
  import Utils (prepBenchmarkFiles)
  
  import qualified Macro.PkgBinary as PkgBinary
  import qualified Macro.PkgCereal as PkgCereal
  import qualified Macro.PkgStore  as PkgStore
  import qualified Macro.CBOR as CBOR
  
  
  benchmarks :: [Benchmark]
  benchmarks =
    [ env prepBenchmarkFiles $ \_ ->
      bgroup "decode-index"
        [ bgroup "binary"
            [ envBinary $ \v ->
                bench "deserialise" $ nf PkgBinary.deserialise v
            ]
        , bgroup "cereal"
            [ envCereal $ \v ->
                bench "deserialise" $ nf PkgCereal.deserialise v
            ]
        , bgroup "store"
            [ envStore $ \v ->
                bench "deserialise" $ nf PkgStore.deserialise v
            ]
        , bgroup "cbor"
            [ envCBOR $ \v ->
                bench "deserialise" $ nf CBOR.deserialise v
            ]
        ]
    , env prepBenchmarkFiles $ \_ ->
      bgroup "decode-index-noaccum"
        [ bgroup "binary"
            [ envBinary $ \v ->
                bench "deserialise" $ nf PkgBinary.deserialiseNull v
            ]
        , bgroup "cereal"
            [ envCereal $ \v ->
                bench "deserialise" $ nf PkgCereal.deserialiseNull v
            ]
        , bgroup "cbor"
            [ envCBOR $ \v ->
                bench "deserialise" $ nf CBOR.deserialiseNull v
            ]
        ]
    ]
    where
      -- Helpers for using Criterion environments.
      envBinary = env (fmap BS.fromStrict (readBin "binary"))
      envCereal = env (fmap BS.fromStrict (readBin "cereal"))
      envStore  = env (readBin "store")
      envCBOR   = env (fmap BS.fromStrict (readBin "cbor"))
  
      -- | Read one of the pre-encoded binary files out of the
      -- data directory.
      readBin :: FilePath -> IO B.ByteString
      readBin f = B.readFile ("serialise" </> "bench" </> "data" </> f <.> "bin")
  