module Hakyll.Core.ResourceProvider
( Resource (..)
, ResourceProvider (..)
, resourceExists
, resourceDigest
, resourceModified
) where
import Control.Monad ((<=<))
import Data.Word (Word8)
import qualified Data.ByteString.Lazy as LB
import OpenSSL.Digest.ByteString.Lazy (digest)
import OpenSSL.Digest (MessageDigest (MD5))
import Hakyll.Core.Identifier
import Hakyll.Core.Store
newtype Resource = Resource {unResource :: Identifier}
deriving (Eq, Show, Ord)
data ResourceProvider = ResourceProvider
{
resourceList :: [Resource]
,
resourceString :: Resource -> IO String
,
resourceLazyByteString :: Resource -> IO LB.ByteString
}
resourceExists :: ResourceProvider -> Identifier -> Bool
resourceExists provider = flip elem $ map unResource $ resourceList provider
resourceDigest :: ResourceProvider -> Resource -> IO [Word8]
resourceDigest provider = digest MD5 <=< resourceLazyByteString provider
resourceModified :: ResourceProvider -> Resource -> Store -> IO Bool
resourceModified provider resource store = do
lastDigest <- storeGet store itemName $ unResource resource
newDigest <- resourceDigest provider resource
if Just newDigest == lastDigest
then return False
else do storeSet store itemName (unResource resource) newDigest
return True
where
itemName = "Hakyll.Core.ResourceProvider.resourceModified"