My first instinct is to just use anyM instead of allM

allFilesThere :: MonadIO m => [Path Abs File] -> m Bool
allFilesThere fs = liftIO $ anyM (not . doesFileExist . fromAbsFile) fs

However you'll now have the opposite problem.  It will take a lot of resources when all the files are there.  But maybe that is okay for your use case?

On Fri, Sep 21, 2018 at 4:25 AM PICCA Frederic-Emmanuel <frederic-emmanuel.picca@synchrotron-soleil.fr> wrote:
Hello,

I would like to have your advice in order to optimize this code.
The purpose is to trigg an action 'a' if a list of files (thousands) exists.
A process copy files from one directory to another.

allFilesThere :: MonadIO m => [Path Abs File] -> m Bool
allFilesThere fs = liftIO $ allM (doesFileExist . fromAbsFile) fs

trigOnAllFiles :: MonadIO m => m r -> [Path Abs File] -> m r
trigOnAllFiles a fs = go
    where
      go = do
        r <- allFilesThere fs
        if r then a else
            ( do liftIO $ threadDelay 1000000
                 go)

It works, but it consums a lot's of resources when all the files does not exists yet.
So I would like your advice in order to optimize it :)

thanks for your help.

Frederic
_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners