{-# LANGUAGE FlexibleInstances #-} module Hash where import Types import qualified Data.ByteString as B import qualified Data.ByteString.Char8 as C8 import qualified Crypto.Hash as H -- | Encode a hash pointer using base16 format. encodeHashPointer :: HashPointer -> B.ByteString encodeHashPointer (HashPointer d) = C8.pack (show d) class Hashable a where hash :: a -> HashPointer instance Hashable B.ByteString where hash = HashPointer . H.hash -- | Hash the concacenation of the hashes, encoding them in base16 format. instance Hashable [HashPointer] where hash = hash . B.concat . map encodeHashPointer instance Hashable a => Hashable (Activity a) where hash (Activity a p s) = hash [hash a, p, hash s] hash (StartActivity a s) = hash [hash a, hash s] instance Hashable Entered where hash v = hash [hash (enteredData v), hash (echoData v)] instance Hashable Seen where hash v = hash [hash (seenData v)] instance Hashable Signature where hash (Signature s) = hash s