summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Hakyll/Core/Store.hs53
1 files changed, 53 insertions, 0 deletions
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