{-# LANGUAGE MultiWayIf #-}
module Main (main) where
import Control.Monad (guard)
import Data.Foldable (toList)
import Data.List (isSuffixOf)
import System.Directory (doesDirectoryExist, doesFileExist,
getDirectoryContents)
import System.FilePath ((</>))
import Test.DocTest (doctest)
main :: IO ()
main = do
sources <- findSources "src"
doctest ("-isrc" : sources)
findSources :: FilePath -> IO [FilePath]
findSources = goDir
where
goItem :: FilePath -> FilePath -> IO [FilePath]
goItem _ ('.':_) = pure []
goItem parent name = do
let path = parent </> name
isDir <- doesDirectoryExist path
isFile <- doesFileExist path
if | isDir -> goDir path
| isFile -> pure $ toList $ goFile path
| otherwise -> pure []
goDir :: FilePath -> IO [FilePath]
goDir path = do
items <- getDirectoryContents path
concat <$> traverse (goItem path) items
goFile :: FilePath -> Maybe FilePath
goFile path = path <$ guard (".hs" `isSuffixOf` path)