    {-|

    This module exposes combinators to compute the BLAKE2b hash and the
    associated HMAC for some common types.

    -}

    module Raaz.Hash.Blake2
           ( -- * The BLAKE2 cryptographic hashes
             BLAKE2b, BLAKE2s
           , blake2b, blake2bFile, blake2bSource
           ) where

    import qualified Data.ByteString as B
    import qualified Data.ByteString.Lazy as L

    import Raaz.Core

    import Raaz.Hash.Internal        ( hashSource, hash, hashFile       )
    import Raaz.Hash.Blake2.Internal
    import Raaz.Hash.Blake2.Recommendation()

    -- | Compute the blake2b hash of an instance of `PureByteSource`. Use
    -- this for computing the sha1 hash of a strict or lazy byte string.
    blake2b       :: PureByteSource src => src -> BLAKE2b
    blake2b :: src -> BLAKE2b
    blake2b       = src -> BLAKE2b
    forall h src.
    (Hash h, Recommendation h, PureByteSource src) =>
    src -> h
    hash

    {-# SPECIALIZE blake2b :: B.ByteString -> BLAKE2b #-}
    {-# SPECIALIZE blake2b :: L.ByteString -> BLAKE2b #-}

    -- | Compute the blake2b hash of a file.
    blake2bFile   :: FilePath -> IO BLAKE2b
    blake2bFile :: FilePath -> IO BLAKE2b
    blake2bFile   = FilePath -> IO BLAKE2b
    forall h. (Hash h, Recommendation h) => FilePath -> IO h
    hashFile

    -- | Compute the blake2b hash of a general byte source.
    blake2bSource :: ByteSource src => src -> IO BLAKE2b
    blake2bSource :: src -> IO BLAKE2b
    blake2bSource = src -> IO BLAKE2b
    forall h src.
    (Hash h, Recommendation h, ByteSource src) =>
    src -> IO h
    hashSource