import qualified Data.ByteString.Lazy as L
import Control.DeepSeq
import Control.Exception (evaluate)
-import Control.Concurrent.MVar
+import Data.IORef
data Hash
= MD5Hash
mkIncrementalVerifier :: HashAlgorithm h => Context h -> Key -> IO IncrementalVerifier
mkIncrementalVerifier ctx key = do
- v <- newMVar ctx
+ v <- newIORef ctx
return $ IncrementalVerifier
- { updateIncremental = \b -> do
- ctx' <- takeMVar v
- let ctx'' = hashUpdate ctx' b
- evaluate $ rnf ctx''
- putMVar v ctx''
+ { updateIncremental = modifyIORef' v . flip hashUpdate
, finalizeIncremental = do
- ctx' <- takeMVar v
+ ctx' <- readIORef v
let digest = hashFinalize ctx'
return $ sameCheckSum key (show digest)
}