aboutsummaryrefslogtreecommitdiffstats
path: root/app/History/Cache.hs
diff options
context:
space:
mode:
authorLibravatar Alexander Foremny <aforemny@posteo.de>2023-10-17 14:14:48 +0200
committerLibravatar Alexander Foremny <aforemny@posteo.de>2023-11-07 09:50:51 +0100
commitea1236f2cf6d3ef4b739b2ca28f47a3bbed42295 (patch)
tree3b1801ad9654e657ed0c0b202e316dc42244c56d /app/History/Cache.hs
parent4521eb7a4b0d4a4ff8cf9153484d0596c5143170 (diff)
refactor history
Diffstat (limited to 'app/History/Cache.hs')
-rw-r--r--app/History/Cache.hs26
1 files changed, 26 insertions, 0 deletions
diff --git a/app/History/Cache.hs b/app/History/Cache.hs
new file mode 100644
index 0000000..af40a84
--- /dev/null
+++ b/app/History/Cache.hs
@@ -0,0 +1,26 @@
+module History.Cache (cached) where
+
+import Data.Binary (Binary, decodeFileOrFail, encodeFile)
+import Data.Text qualified as T
+import System.Directory (createDirectoryIfMissing, doesFileExist, getCurrentDirectory)
+
+cached :: Binary a => T.Text -> (T.Text -> IO a) -> IO a
+cached hash func = do
+ -- FIXME Cache inside Git root
+ --
+ -- The cache location should not be dependant on the current directory, but
+ -- should be placed alongside the `.git` directory.
+ cwd <- getCurrentDirectory
+ createDirectoryIfMissing True (cwd ++ "/.anissue")
+ let file = (cwd ++ "/.anissue/" ++ T.unpack hash)
+ doesFileExist file >>= \case
+ True ->
+ decodeFileOrFail file >>= \case
+ Left _ -> generate file
+ Right blob -> pure blob
+ False -> generate file
+ where
+ generate file = do
+ blob <- func hash
+ encodeFile file blob
+ pure blob