Skip to content

Commit 650a12c

Browse files
committed
Stack.Package: keep as Sets rather than converting to/from lists (#32,#105)
1 parent 78dd63f commit 650a12c

File tree

1 file changed

+41
-38
lines changed

1 file changed

+41
-38
lines changed

src/Stack/Package.hs

Lines changed: 41 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ import qualified Data.Map.Strict as M
5050
import Data.Maybe
5151
import Data.Maybe.Extra
5252
import Data.Monoid
53+
import Data.Set (Set)
5354
import qualified Data.Set as S
5455
import Data.Text (Text)
5556
import qualified Data.Text as T
@@ -149,10 +150,10 @@ resolvePackage packageConfig gpkg = Package
149150
distDir <- distDirFromDir (parent cabalfp)
150151
files <- runReaderT (packageDescFiles ty pkg)
151152
(cabalfp, buildDir distDir)
152-
return $ S.fromList $
153+
return $
153154
case ty of
154155
Modules -> files
155-
AllFiles -> cabalfp : files
156+
AllFiles -> S.insert cabalfp files
156157
, packageTools = packageDescTools pkg
157158
, packageFlags = packageConfigFlags packageConfig
158159
, packageAllDeps = S.fromList (M.keys deps)
@@ -317,13 +318,13 @@ allBuildInfo' pkg_descr = [ bi | Just lib <- [library pkg_descr]
317318
-- | Get all files referenced by the package.
318319
packageDescFiles
319320
:: (MonadLogger m, MonadIO m, MonadThrow m, MonadReader (Path Abs File, Path Abs Dir) m, MonadCatch m)
320-
=> CabalFileType -> PackageDescription -> m [Path Abs File]
321+
=> CabalFileType -> PackageDescription -> m (Set (Path Abs File))
321322
packageDescFiles ty pkg = do
322323
libfiles <-
323-
liftM concat (mapM (libraryFiles ty) (maybe [] return (library pkg)))
324-
exefiles <- liftM concat (mapM (executableFiles ty) (executables pkg))
325-
benchfiles <- liftM concat (mapM (benchmarkFiles ty) (benchmarks pkg))
326-
testfiles <- liftM concat (mapM (testFiles ty) (testSuites pkg))
324+
liftM S.unions (mapM (libraryFiles ty) (maybe [] return (library pkg)))
325+
exefiles <- liftM S.unions (mapM (executableFiles ty) (executables pkg))
326+
benchfiles <- liftM S.unions (mapM (benchmarkFiles ty) (benchmarks pkg))
327+
testfiles <- liftM S.unions (mapM (testFiles ty) (testSuites pkg))
327328
dfiles <- resolveGlobFiles (map (dataDir pkg FilePath.</>) (dataFiles pkg))
328329
srcfiles <- resolveGlobFiles (extraSrcFiles pkg)
329330
-- extraTmpFiles purposely not included here, as those are files generated
@@ -332,24 +333,23 @@ packageDescFiles ty pkg = do
332333
docfiles <- resolveGlobFiles (extraDocFiles pkg)
333334
case ty of
334335
Modules ->
335-
return (nubOrd (concat [libfiles, exefiles, testfiles, benchfiles]))
336+
return (S.unions [libfiles, exefiles, testfiles, benchfiles])
336337
AllFiles ->
337338
return
338-
(nubOrd
339-
(concat
340-
[ libfiles
341-
, exefiles
342-
, dfiles
343-
, srcfiles
344-
, docfiles
345-
, benchfiles
346-
, testfiles]))
339+
(S.unions
340+
[ libfiles
341+
, exefiles
342+
, dfiles
343+
, srcfiles
344+
, docfiles
345+
, benchfiles
346+
, testfiles])
347347

348348
-- | Resolve globbing of files (e.g. data files) to absolute paths.
349349
resolveGlobFiles :: (MonadLogger m,MonadIO m,MonadThrow m,MonadReader (Path Abs File, Path Abs Dir) m,MonadCatch m)
350-
=> [String] -> m [Path Abs File]
350+
=> [String] -> m (Set (Path Abs File))
351351
resolveGlobFiles =
352-
liftM (catMaybes . concat) .
352+
liftM (S.fromList . catMaybes . concat) .
353353
mapM resolve
354354
where
355355
resolve name =
@@ -409,7 +409,7 @@ matchDirFileGlob_ dir filepath = case parseFileGlob filepath of
409409

410410
-- | Get all files referenced by the benchmark.
411411
benchmarkFiles :: (MonadLogger m, MonadIO m, MonadThrow m, MonadReader (Path Abs File, Path Abs Dir) m)
412-
=> CabalFileType -> Benchmark -> m [Path Abs File]
412+
=> CabalFileType -> Benchmark -> m (Set (Path Abs File))
413413
benchmarkFiles ty bench = do
414414
dirs <- mapMaybeM resolveDirOrWarn (hsSourceDirs build)
415415
dir <- asks (parent . fst)
@@ -420,7 +420,7 @@ benchmarkFiles ty bench = do
420420
names
421421
haskellModuleExts
422422
cfiles <- buildCSources ty build
423-
return (rfiles ++ cfiles)
423+
return (S.union rfiles cfiles)
424424
where
425425
names =
426426
case ty of
@@ -437,7 +437,7 @@ benchmarkFiles ty bench = do
437437

438438
-- | Get all files referenced by the test.
439439
testFiles :: (MonadLogger m, MonadIO m, MonadThrow m, MonadReader (Path Abs File, Path Abs Dir) m)
440-
=> CabalFileType -> TestSuite -> m [Path Abs File]
440+
=> CabalFileType -> TestSuite -> m (Set (Path Abs File))
441441
testFiles ty test = do
442442
dirs <- mapMaybeM resolveDirOrWarn (hsSourceDirs build)
443443
dir <- asks (parent . fst)
@@ -448,7 +448,7 @@ testFiles ty test = do
448448
names
449449
haskellModuleExts
450450
cfiles <- buildCSources ty build
451-
return (rfiles ++ cfiles)
451+
return (S.union rfiles cfiles)
452452
where
453453
names =
454454
case ty of
@@ -467,7 +467,7 @@ testFiles ty test = do
467467

468468
-- | Get all files referenced by the executable.
469469
executableFiles :: (MonadLogger m,MonadIO m,MonadThrow m,MonadReader (Path Abs File, Path Abs Dir) m)
470-
=> CabalFileType -> Executable -> m [Path Abs File]
470+
=> CabalFileType -> Executable -> m (Set (Path Abs File))
471471
executableFiles ty exe =
472472
do dirs <- mapMaybeM resolveDirOrWarn (hsSourceDirs build)
473473
dir <- asks (parent . fst)
@@ -478,7 +478,7 @@ executableFiles ty exe =
478478
names
479479
haskellModuleExts
480480
cfiles <- buildCSources ty build
481-
return (rfiles ++ cfiles)
481+
return (S.union rfiles cfiles)
482482
where
483483
names =
484484
case ty of
@@ -490,7 +490,7 @@ executableFiles ty exe =
490490

491491
-- | Get all files referenced by the library.
492492
libraryFiles :: (MonadLogger m,MonadIO m,MonadThrow m,MonadReader (Path Abs File, Path Abs Dir) m)
493-
=> CabalFileType -> Library -> m [Path Abs File]
493+
=> CabalFileType -> Library -> m (Set (Path Abs File))
494494
libraryFiles ty lib =
495495
do dirs <- mapMaybeM resolveDirOrWarn (hsSourceDirs build)
496496
dir <- asks (parent . fst)
@@ -501,7 +501,7 @@ libraryFiles ty lib =
501501
names
502502
haskellModuleExts
503503
cfiles <- buildCSources ty build
504-
return (rfiles ++ cfiles)
504+
return (S.union rfiles cfiles)
505505
where
506506
names =
507507
case ty of
@@ -513,9 +513,11 @@ libraryFiles ty lib =
513513

514514
-- | Get all C sources in a build.
515515
buildCSources :: (MonadLogger m,MonadIO m,MonadThrow m,MonadReader (Path Abs File, Path Abs Dir) m)
516-
=> CabalFileType -> BuildInfo -> m [Path Abs File]
517-
buildCSources Modules _ = return []
518-
buildCSources AllFiles build = mapMaybeM resolveFileOrWarn (cSources build)
516+
=> CabalFileType -> BuildInfo -> m (Set (Path Abs File))
517+
buildCSources Modules _ =
518+
return S.empty
519+
buildCSources AllFiles build =
520+
liftM S.fromList (mapMaybeM resolveFileOrWarn (cSources build))
519521

520522
-- | Get all dependencies of a package, including library,
521523
-- executables, tests, benchmarks.
@@ -644,7 +646,7 @@ resolveFilesAndDeps
644646
-> [Path Abs Dir] -- ^ Directories to look in.
645647
-> [Either ModuleName String] -- ^ Base names.
646648
-> [Text] -- ^ Extentions.
647-
-> m [Path Abs File]
649+
-> m (Set (Path Abs File))
648650
resolveFilesAndDeps ty component dirs names0 exts = do
649651
(moduleFiles,thFiles,foundModules) <- loop names0 S.empty
650652
cabalfp <- asks fst
@@ -664,27 +666,27 @@ resolveFilesAndDeps ty component dirs names0 exts = do
664666
Just c -> " for '" ++ c ++ "'") ++
665667
" component (add to other-modules):\n " ++
666668
intercalate "\n " (map display (S.toList unlistedModules))
667-
return (S.toList moduleFiles ++ thFiles)
669+
return (S.union moduleFiles thFiles)
668670
where
669-
loop [] doneModules = return (S.empty, [], doneModules)
671+
loop [] doneModules = return (S.empty, S.empty, doneModules)
670672
loop names doneModules0 = do
671673
resolvedFiles <- resolveFiles dirs names exts
672674
pairs <- mapM getDependencies resolvedFiles
673675
let doneModules' = S.union doneModules0 (S.fromList (lefts names))
674676
moduleDeps = S.unions (map fst pairs)
675-
thDepFiles = concatMap snd pairs
677+
thDepFiles = S.unions (map snd pairs)
676678
modulesRemaining = S.difference moduleDeps doneModules'
677679
(moduleDepFiles',thDepFiles',doneModules'') <-
678680
loop (map Left (S.toList modulesRemaining)) doneModules'
679681
return
680682
( S.union (S.fromList resolvedFiles) moduleDepFiles'
681-
, thDepFiles ++ thDepFiles'
683+
, S.union thDepFiles thDepFiles'
682684
, doneModules'')
683685
getDependencies resolvedFile = do
684686
dir <- asks (parent . fst)
685687
dumpHIDir <- getDumpHIDir
686688
case stripDir dir resolvedFile of
687-
Nothing -> return (S.empty, [])
689+
Nothing -> return (S.empty, S.empty)
688690
Just fileRel -> do
689691
let dumpHIPath =
690692
FilePath.replaceExtension
@@ -693,7 +695,7 @@ resolveFilesAndDeps ty component dirs names0 exts = do
693695
dumpHIExists <- liftIO $ doesFileExist dumpHIPath
694696
if dumpHIExists
695697
then parseDumpHI dumpHIPath
696-
else return (S.empty, [])
698+
else return (S.empty, S.empty)
697699
parseDumpHI dumpHIPath = do
698700
dir <- asks (parent . fst)
699701
dumpHI <- liftIO $ fmap C8.lines (C8.readFile dumpHIPath)
@@ -713,14 +715,15 @@ resolveFilesAndDeps ty component dirs names0 exts = do
713715
AllFiles ->
714716
-- The dependent file path is surrounded by quotes but is not escaped.
715717
-- It can be an absolute or relative path.
718+
S.fromList $
716719
mapMaybe
717720
(parseAbsOrRelFile dir <=<
718721
(fmap T.unpack .
719722
(T.stripSuffix "\"" <=< T.stripPrefix "\"") .
720723
T.dropWhileEnd (== '\r') .
721724
decodeUtf8 . C8.dropWhile (/= '"'))) $
722725
filter ("addDependentFile \"" `C8.isPrefixOf`) dumpHI
723-
Modules -> []
726+
Modules -> S.empty
724727
return
725728
(moduleDeps, thDeps)
726729
getDumpHIDir = do

0 commit comments

Comments
 (0)