From 95f59be5a0be65c4eccdd020fc7938cd9afd7dde Mon Sep 17 00:00:00 2001 From: Jasper Van der Jeugt Date: Sun, 26 Dec 2010 16:12:57 +0100 Subject: Simple key-value store --- src/Hakyll/Core/Store.hs | 53 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/Hakyll/Core/Store.hs (limited to 'src/Hakyll') diff --git a/src/Hakyll/Core/Store.hs b/src/Hakyll/Core/Store.hs new file mode 100644 index 0000000..02b9b4e --- /dev/null +++ b/src/Hakyll/Core/Store.hs @@ -0,0 +1,53 @@ +-- | 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 -- cgit v1.2.3