Я закончил читать руководство по каналам и Я хотел написать функцию для рекурсивного перечисления всех файлов в каталоге. Я пробовал со следующим кодом:
enumFiles :: FilePath -> Producer' FilePath (PS.SafeT IO) ()
enumFiles path =
PS.bracket (openDirStream path) (closeDirStream) loop
where
loop :: DirStream -> Producer' FilePath (PS.SafeT IO) ()
loop ds = PS.liftBase (readDirStream ds) >>= checkName
where
checkName :: FilePath -> Producer' FilePath (PS.SafeT IO) ()
checkName "" = return ()
checkName "." = loop ds
checkName ".." = loop ds
checkName name = PS.liftBase (getSymbolicLinkStatus newPath)
>>= checkStat newPath
where newPath = path </> name
checkStat path stat
| isRegularFile stat = yield path >> loop ds
| isDirectory stat = enumFiles path
| otherwise = loop ds
Однако этот производитель завершится, как только будет достигнуто return ()
. Я предполагаю, что я не сочиняю это правильно, но я не вижу, как правильно это сделать.