<div dir="ltr"><div><div>Hi Dear Haskellers,<br><br></div>I have this small program to grep recursively in parallel. It works fine, but generates the last line empty. Is this empty line coming from mapConcurrently()?<br><br>

</div><div>Thanks,<br><br></div><div>Hong<br></div><div><br><div>-- mygrepr.hs<br></div><div>-- <a href="http://lrf.pl">lrf.pl</a> is an old Perl script to get all non-duplicate files recursively under the current directory, since some of directories have tons of links<br>

</div>-- the program runs concurrently on either specified number of threads or 3/4 of the number of available cores<br><br>module Main (main) where<br><br>import Control.Concurrent.Async<br>import Control.Monad<br>import Data.List<br>

import Data.List.Split<br>import GHC.Conc<br>import System.Environment ( getArgs )<br>import System.Exit<br>import System.Process<br>import Text.Regex.Posix<br><br>main :: IO () <br>main = do<br>    hs_argv &lt;- getArgs<br>

    if null hs_argv || any (=~ &quot;-h&quot;) hs_argv || any (=~ &quot;--h&quot;) hs_argv then<br>        putStrLn &quot;mygrepr [+RTS -N[x] -RTS] [OPTION]... PATTERN&quot;<br>    else do<br>        numCores &lt;- getNumProcessors<br>

        numCapas &lt;- getNumCapabilities<br>        let numT | numCapas &gt; 1 = numCapas<br>                      | otherwise        = max numCapas (numCores `div` 4 * 3)<br>        _ &lt;- setNumCapabilities numT<br>        let numThreads = fromIntegral numT :: Double<br>

        findResult &lt;- readProcess &quot;<a href="http://lrf.pl">lrf.pl</a>&quot; [] []<br>        let files = lines findResult<br>        let num_of_files = fromIntegral $ length files :: Double<br>        let chunks = chunksOf (ceiling (num_of_files/numThreads)) files<br>

        results &lt;- mapConcurrently (grep hs_argv) chunks<br>        let (_, grepResult, _) = unzip3 results<br>        putStr $ unlines $ nub $ filter (\line -&gt; not (line =~ &quot;Binary file .* matches&quot;)) $ lines (concat grepResult)<br>

<br>grep :: [String] -&gt; [String] -&gt; IO (ExitCode, String, String)<br>grep hs_argv files = readProcessWithExitCode &quot;/tool/pandora64/.package/grep-2.5.4/bin/grep&quot; (hs_argv ++ files) []<br><br></div></div>