content: module HashBench (benchHash, hashEnv) where
  
  import Criterion
  
  import Control.Monad
  
  import Crypto.Saltine.Core.Hash
  import Crypto.Saltine.Core.Utils
  
  import BenchUtils
  import Data.Maybe (fromJust)
  
  hashEnv :: IO (ShorthashKey, GenerichashKey, GenerichashOutLen)
  hashEnv = do
      shk <- newShorthashKey
      ghk <- fromJust <$> newGenerichashKey 48
      let ghol = fromJust (generichashOutLen 48)
  
      pure (shk,ghk,ghol)
  
  benchHash :: (ShorthashKey, GenerichashKey, GenerichashOutLen) -> Benchmark
  benchHash (shk,ghk,ghol) =
    bgroup "Hash"
      [ bgroup "hash"
        [ bench "128 B" $ nf hash bs128
        , bench "1 MB"  $ nf hash mb1
        , bench "5 MB"  $ nf hash mb5
        ]
      , bgroup "shortHash"
        [ bench "128 B" $ nf (shorthash shk) bs128
        , bench "2 KB"  $ nf (shorthash shk) kb2
        , bench "1 MB"  $ nf (shorthash shk) mb1
        ]
      , bgroup "genericHash"
        [ bench "128 B" $ nf (generichash ghk bs128) ghol
        , bench "2 KB"  $ nf (generichash ghk kb2  ) ghol
        , bench "1 MB"  $ nf (generichash ghk mb1  ) ghol
        , bench "5 MB"  $ nf (generichash ghk mb5  ) ghol
        ]
      ]
  