{- |
Module : IO
Copyright : Copyright (C) 2013-2014 Krzysztof Langner
License : BSD3

Helper module with functions operating on IO
-}
module IO 
        ( listFiles
        , listDirs
        )where

import System.Directory (canonicalizePath, getDirectoryContents, doesDirectoryExist)
import Data.List
import Control.Monad


-- | list files
listFiles :: FilePath -> IO [FilePath]            
listFiles p = do 
    contents <- list p
    filterM (fmap not . doesDirectoryExist) contents

    
-- | list subdirectories
listDirs :: FilePath -> IO [FilePath]            
listDirs p = do
    contents <- list p
    filterM doesDirectoryExist contents
    
-- | list directory content
list :: FilePath -> IO [FilePath]            
list p = do 
    ds <- getDirectoryContents p
    let filtered = filter f ds
    path <- canonicalizePath $ p  
    return $ map ((path++"/")++) filtered
    where f x = and [x /= ".", x /= "..", (not . isPrefixOf ".") x]
    