Use findM instead of filterM

Using filterM makes us run the monadic predicate on every list element.
Use findM instead so that we can stop once we find a matching one.
This commit is contained in:
Joseph C. Sible 2020-02-08 22:55:45 -05:00
parent 61b073d507
commit bd116f252b
1 changed files with 9 additions and 3 deletions

View File

@ -491,6 +491,12 @@ ioInterface options files = do
first <- a arg
if not first then return False else b arg
findM p = foldr go (pure Nothing)
where
go x acc = do
b <- p x
if b then pure (Just x) else acc
findSourceFile inputs sourcePathFlag currentScript sourcePathAnnotation original =
if isAbsolute original
then
@ -500,11 +506,11 @@ ioInterface options files = do
find original original
where
find filename deflt = do
sources <- filterM ((allowable inputs) `andM` doesFileExist) $
sources <- findM ((allowable inputs) `andM` doesFileExist) $
(adjustPath filename):(map (</> filename) $ map adjustPath $ sourcePathFlag ++ sourcePathAnnotation)
case sources of
[] -> return deflt
(first:_) -> return first
Nothing -> return deflt
Just first -> return first
scriptdir = dropFileName currentScript
adjustPath str =
case (splitDirectories str) of