<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hi,<div><br></div><div>Current code re-checks file existence always in same order, so worst case is - N files and only last of them does not exists.</div><div>In that case this code will re-check (N-1) files during each consecutive retry.</div><div>This can be optimized by moving already existing files to the end of file list(or dropping them from list completely, if files are only added but never removed).</div><div>For this you could re-write `allFilesThere` something like:</div><div>allFilesThere fs = liftIO $ do</div><div>  existing, non_existing <- <a name="v:partitionM" class="gmail-def" style="font-size:13px;color:rgb(0,0,0);margin:0px;padding:0px;font-weight:bold;font-family:monospace;background-color:rgb(240,240,240)">partitionM</a> (doesFileExist . fromAbsFile) fs</div><div>  return (non_existing++ existing, null non_existing)</div><div><br></div><div>Then allFilesThere could start next iteration by checking previously non-existing files and probably failing much faster.</div></div></div></div></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr">On Fri, Sep 21, 2018 at 11:25 AM PICCA Frederic-Emmanuel <<a href="mailto:frederic-emmanuel.picca@synchrotron-soleil.fr">frederic-emmanuel.picca@synchrotron-soleil.fr</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hello,<br>
<br>
I would like to have your advice in order to optimize this code.<br>
The purpose is to trigg an action 'a' if a list of files (thousands) exists.<br>
A process copy files from one directory to another.<br>
<br>
allFilesThere :: MonadIO m => [Path Abs File] -> m Bool<br>
allFilesThere fs = liftIO $ allM (doesFileExist . fromAbsFile) fs<br>
<br>
trigOnAllFiles :: MonadIO m => m r -> [Path Abs File] -> m r<br>
trigOnAllFiles a fs = go<br>
    where<br>
      go = do<br>
        r <- allFilesThere fs<br>
        if r then a else<br>
            ( do liftIO $ threadDelay 1000000<br>
                 go)<br>
<br>
It works, but it consums a lot's of resources when all the files does not exists yet.<br>
So I would like your advice in order to optimize it :)<br>
<br>
thanks for your help.<br>
<br>
Frederic<br>
_______________________________________________<br>
Beginners mailing list<br>
<a href="mailto:Beginners@haskell.org" target="_blank">Beginners@haskell.org</a><br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners" rel="noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners</a><br>
</blockquote></div>