{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}

module Bench.Crypto.HASH (
  benchmarks,
) where

import Cardano.Binary
import Data.Proxy

import Cardano.Crypto.Hash.Blake2b
import Cardano.Crypto.Hash.Class

import Criterion

import Bench.Crypto.BenchData

benchmarks :: Benchmark
benchmarks :: Benchmark
benchmarks =
  String -> [Benchmark] -> Benchmark
bgroup
    String
"HASH"
    [ Proxy Blake2b_224 -> String -> Benchmark
forall (proxy :: * -> *) h.
HashAlgorithm h =>
proxy h -> String -> Benchmark
benchHASH (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @Blake2b_224) String
"Blake2b_224"
    , Proxy Blake2b_256 -> String -> Benchmark
forall (proxy :: * -> *) h.
HashAlgorithm h =>
proxy h -> String -> Benchmark
benchHASH (forall t. Proxy t
forall {k} (t :: k). Proxy t
Proxy @Blake2b_256) String
"Blake2b_256"
    ]

benchHASH ::
  forall proxy h.
  HashAlgorithm h =>
  proxy h ->
  [Char] ->
  Benchmark
benchHASH :: forall (proxy :: * -> *) h.
HashAlgorithm h =>
proxy h -> String -> Benchmark
benchHASH proxy h
_ String
lbl =
  String -> [Benchmark] -> Benchmark
bgroup
    String
lbl
    [ String -> Benchmarkable -> Benchmark
bench String
"hashWith" (Benchmarkable -> Benchmark) -> Benchmarkable -> Benchmark
forall a b. (a -> b) -> a -> b
$
        (ByteString -> Hash h ByteString) -> ByteString -> Benchmarkable
forall b a. NFData b => (a -> b) -> a -> Benchmarkable
nf (forall h a. HashAlgorithm h => (a -> ByteString) -> a -> Hash h a
hashWith @h ByteString -> ByteString
forall a. a -> a
id) ByteString
testBytes
    , IO ByteString -> (ByteString -> Benchmark) -> Benchmark
forall env. NFData env => IO env -> (env -> Benchmark) -> Benchmark
env (ByteString -> IO ByteString
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (Hash h ByteString -> ByteString
forall a. ToCBOR a => a -> ByteString
serialize' (forall h a. HashAlgorithm h => (a -> ByteString) -> a -> Hash h a
hashWith @h ByteString -> ByteString
forall a. a -> a
id ByteString
testBytes))) ((ByteString -> Benchmark) -> Benchmark)
-> (ByteString -> Benchmark) -> Benchmark
forall a b. (a -> b) -> a -> b
$
        String -> Benchmarkable -> Benchmark
bench String
"decodeHash"
          (Benchmarkable -> Benchmark)
-> (ByteString -> Benchmarkable) -> ByteString -> Benchmark
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (ByteString -> Hash h ByteString) -> ByteString -> Benchmarkable
forall b a. NFData b => (a -> b) -> a -> Benchmarkable
nf ((DecoderError -> Hash h ByteString)
-> (Hash h ByteString -> Hash h ByteString)
-> Either DecoderError (Hash h ByteString)
-> Hash h ByteString
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either (String -> Hash h ByteString
forall a. HasCallStack => String -> a
error (String -> Hash h ByteString)
-> (DecoderError -> String) -> DecoderError -> Hash h ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DecoderError -> String
forall a. Show a => a -> String
show) (forall a. a -> a
id @(Hash h ByteString)) (Either DecoderError (Hash h ByteString) -> Hash h ByteString)
-> (ByteString -> Either DecoderError (Hash h ByteString))
-> ByteString
-> Hash h ByteString
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ByteString -> Either DecoderError (Hash h ByteString)
forall a. FromCBOR a => ByteString -> Either DecoderError a
decodeFull')
    ]