wip, works, suspictious

This commit is contained in:
Dmitry Zuikov 2024-08-02 14:20:15 +03:00
parent 91a9739ca7
commit 3df586c7a1
2 changed files with 36 additions and 15 deletions

View File

@ -93,6 +93,7 @@ common shared-properties
, random , random
, vector , vector
, unix , unix
, split
library library

View File

@ -18,6 +18,8 @@ import UnliftIO
import Control.Concurrent.STM qualified as STM import Control.Concurrent.STM qualified as STM
import Streaming.Prelude qualified as S import Streaming.Prelude qualified as S
import Data.List.Split (chunksOf)
glob :: forall m . MonadIO m glob :: forall m . MonadIO m
=> [FilePattern] -- ^ search patterns => [FilePattern] -- ^ search patterns
-> [FilePattern] -- ^ ignore patterns -> [FilePattern] -- ^ ignore patterns
@ -28,22 +30,40 @@ glob :: forall m . MonadIO m
glob pat ignore dir action = do glob pat ignore dir action = do
let seed = [dir] let seed = [dir]
q <- newTQueueIO
a <- liftIO $ async do
flip fix seed $ \next items -> do flip fix seed $ \next items -> do
case items of case items of
[] -> pure () [] -> atomically (writeTQueue q Nothing)
(p:rest) -> do (p:rest) -> do
isD <- liftIO (doesDirectoryExist p) isD <- liftIO (doesDirectoryExist p)
if isD && not (skip p) then do if isD && not (skip p) then do
content <- liftIO (try @_ @IOError $ listDirectory p) content <- liftIO (try @_ @IOError $ listDirectory p)
<&> fromRight mempty <&> fromRight mempty
let found = [ p </> x | x <- content ] let found = [ p </> x | x <- content ]
next (rest <> found)
forConcurrently_ found $ \f -> do
glob pat ignore f $ \fn -> do
atomically $ writeTQueue q (Just fn)
pure True
next []
else do else do
isF <- liftIO (doesFileExist p) isF <- liftIO (doesFileExist p)
when (isF && matches pat p ) do when (isF && matches pat p ) do
void $ action p atomically (writeTQueue q (Just p))
next rest next rest
fix \next -> do
r <- atomically (readTQueue q)
case r of
Nothing -> pure ()
Just e -> void (action e) >> next
where where
matches p f = or [ i ?== f | i <- p ] matches p f = or [ i ?== f | i <- p ]
skip p = or [ i ?== p | i <- ignore ] skip p = or [ i ?== p | i <- ignore ]