aboutsummaryrefslogtreecommitdiff
path: root/compiler/src/Caching.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/src/Caching.hs')
-rw-r--r--compiler/src/Caching.hs76
1 files changed, 76 insertions, 0 deletions
diff --git a/compiler/src/Caching.hs b/compiler/src/Caching.hs
new file mode 100644
index 0000000..c2b5a43
--- /dev/null
+++ b/compiler/src/Caching.hs
@@ -0,0 +1,76 @@
1-- ldgallery - A static generator which turns a collection of tagged
2-- pictures into a searchable web gallery.
3--
4-- Copyright (C) 2019-2020 Pacien TRAN-GIRARD
5--
6-- This program is free software: you can redistribute it and/or modify
7-- it under the terms of the GNU Affero General Public License as
8-- published by the Free Software Foundation, either version 3 of the
9-- License, or (at your option) any later version.
10--
11-- This program is distributed in the hope that it will be useful,
12-- but WITHOUT ANY WARRANTY; without even the implied warranty of
13-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14-- GNU Affero General Public License for more details.
15--
16-- You should have received a copy of the GNU Affero General Public License
17-- along with this program. If not, see <https://www.gnu.org/licenses/>.
18
19module Caching
20 ( Cache
21 , noCache
22 , ItemCache
23 , buildItemCache
24 , useCached
25 ) where
26
27
28import Control.Monad (when)
29import qualified Data.Map.Strict as Map
30import System.Directory (removePathForcibly, doesDirectoryExist, doesFileExist)
31
32import FileProcessors (FileProcessor)
33import Resource (GalleryItem(..), flattenGalleryTree)
34import Files
35
36
37type Cache a = FileProcessor a -> FileProcessor a
38
39
40noCache :: Cache a
41noCache processor itemPath resPath inputFsPath outputFsPath =
42 removePathForcibly outputFsPath
43 >> processor itemPath resPath inputFsPath outputFsPath
44
45
46type ItemCache = Path -> Maybe GalleryItem
47
48buildItemCache :: Maybe GalleryItem -> ItemCache
49buildItemCache cachedItems = lookupCache
50 where
51 withKey item = (webPath $ Resource.path item, item)
52 cachedItemList = maybe [] flattenGalleryTree cachedItems
53 cachedMap = Map.fromList (map withKey cachedItemList)
54 lookupCache path = Map.lookup (webPath path) cachedMap
55
56useCached :: ItemCache -> (GalleryItem -> a) -> Cache a
57useCached cache propGetter processor itemPath resPath inputFsPath outputFsPath =
58 do
59 isDir <- doesDirectoryExist outputFsPath
60 when isDir $ removePathForcibly outputFsPath
61
62 fileExists <- doesFileExist outputFsPath
63 if fileExists then
64 do
65 needUpdate <- isOutdated True inputFsPath outputFsPath
66 case (needUpdate, cache itemPath) of
67 (False, Just props) -> fromCache props
68 _ -> update
69 else
70 update
71
72 where
73 update = processor itemPath resPath inputFsPath outputFsPath
74 fromCache props =
75 putStrLn ("From cache:\t" ++ outputFsPath)
76 >> return (propGetter props)