53 lines
1.3 KiB
Haskell
53 lines
1.3 KiB
Haskell
-- | A store for stroing and retreiving items
|
|
--
|
|
module Hakyll.Core.Store
|
|
( Store
|
|
, makeStore
|
|
, storeSet
|
|
, storeGet
|
|
) where
|
|
|
|
import Control.Applicative ((<$>))
|
|
import System.FilePath ((</>))
|
|
import System.Directory (doesFileExist)
|
|
|
|
import Data.Binary (Binary, encodeFile, decodeFile)
|
|
|
|
import Hakyll.Core.Identifier
|
|
import Hakyll.Core.Util.File
|
|
|
|
-- | Data structure used for the store
|
|
--
|
|
data Store = Store
|
|
{ storeDirectory :: FilePath
|
|
}
|
|
|
|
-- | Initialize the store
|
|
--
|
|
makeStore :: FilePath -> IO Store
|
|
makeStore directory = return Store {storeDirectory = directory}
|
|
|
|
-- | Create a path
|
|
--
|
|
makePath :: Store -> String -> Identifier -> FilePath
|
|
makePath store name identifier =
|
|
storeDirectory store </> name </> toFilePath identifier
|
|
|
|
-- | Store an item
|
|
--
|
|
storeSet :: Binary a => Store -> String -> Identifier -> a -> IO ()
|
|
storeSet store name identifier value = do
|
|
makeDirectories path
|
|
encodeFile path value
|
|
where
|
|
path = makePath store name identifier
|
|
|
|
-- | Load an item
|
|
--
|
|
storeGet :: Binary a => Store -> String -> Identifier -> IO (Maybe a)
|
|
storeGet store name identifier = do
|
|
exists <- doesFileExist path
|
|
if exists then Just <$> decodeFile path
|
|
else return Nothing
|
|
where
|
|
path = makePath store name identifier
|