aboutsummaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
authorpacien2020-02-01 00:00:23 +0100
committerpacien2020-02-01 00:00:36 +0100
commit9b947996588c02867541ee394aa84fd3839d5f47 (patch)
tree665d9414dd0a4ac57a3b170a301941a68e353534 /compiler
parent245fee3fe5abdc6ad14513ef6522446aba4c905a (diff)
downloadldgallery-9b947996588c02867541ee394aa84fd3839d5f47.tar.gz
compiler: optimise dir diff for output cleanup
n log n by sorting instead of silly n^2 GitHub: closes #70
Diffstat (limited to 'compiler')
-rw-r--r--compiler/package.yaml1
-rw-r--r--compiler/src/Resource.hs21
2 files changed, 19 insertions, 3 deletions
diff --git a/compiler/package.yaml b/compiler/package.yaml
index 9b96d17..1769833 100644
--- a/compiler/package.yaml
+++ b/compiler/package.yaml
@@ -17,6 +17,7 @@ description: Please see the README on GitHub at <https://github.com/paci
17dependencies: 17dependencies:
18- base >= 4.7 && < 5 18- base >= 4.7 && < 5
19- containers 19- containers
20- data-ordlist
20- filepath 21- filepath
21- directory 22- directory
22- text 23- text
diff --git a/compiler/src/Resource.hs b/compiler/src/Resource.hs
index c0ef317..599509e 100644
--- a/compiler/src/Resource.hs
+++ b/compiler/src/Resource.hs
@@ -24,8 +24,8 @@ module Resource
24 24
25 25
26import Control.Concurrent.ParallelIO.Global (parallel) 26import Control.Concurrent.ParallelIO.Global (parallel)
27import Data.List ((\\), sortBy) 27import Data.List (sortOn)
28import Data.Ord (comparing) 28import Data.List.Ordered (minusBy)
29import Data.Char (toLower) 29import Data.Char (toLower)
30import Data.Maybe (mapMaybe, fromMaybe, maybeToList) 30import Data.Maybe (mapMaybe, fromMaybe, maybeToList)
31import Data.Function ((&)) 31import Data.Function ((&))
@@ -202,11 +202,26 @@ galleryOutputDiff resources ref =
202 thumbnailPaths :: [GalleryItem] -> [Path] 202 thumbnailPaths :: [GalleryItem] -> [Path]
203 thumbnailPaths = (map resourcePath) . (mapMaybe thumbnail) 203 thumbnailPaths = (map resourcePath) . (mapMaybe thumbnail)
204 204
205 (\\) :: [Path] -> [Path] -> [Path]
206 a \\ b = minusOn orderedForm (sortOn orderedForm a) (sortOn orderedForm b)
207 where
208 orderedForm :: Path -> WebPath
209 orderedForm = webPath
210
211 minusOn :: Ord b => (a -> b) -> [a] -> [a] -> [a]
212 minusOn f l r = map snd $ minusBy comparingFst (packRef f l) (packRef f r)
213
214 packRef :: (a -> b) -> [a] -> [(b, a)]
215 packRef f = map (\x -> let y = f x in y `seq` (y, x))
216
217 comparingFst :: Ord b => (b, a) -> (b, a) -> Ordering
218 comparingFst (l, _) (r, _) = compare l r
219
205 220
206galleryCleanupResourceDir :: GalleryItem -> FileName -> IO () 221galleryCleanupResourceDir :: GalleryItem -> FileName -> IO ()
207galleryCleanupResourceDir resourceTree outputDir = 222galleryCleanupResourceDir resourceTree outputDir =
208 readDirectory outputDir 223 readDirectory outputDir
209 >>= return . galleryOutputDiff resourceTree . root 224 >>= return . galleryOutputDiff resourceTree . root
210 >>= return . sortBy (flip $ comparing pathLength) -- nested files before dirs 225 >>= return . sortOn ((0 -) . pathLength) -- nested files before their parent dirs
211 >>= return . map (localPath . (/>) outputDir) 226 >>= return . map (localPath . (/>) outputDir)
212 >>= mapM_ remove 227 >>= mapM_ remove