packages feed

hist-pl-lexicon-0.6.0: src/NLP/HistPL/Binary/Util.hs

{-# LANGUAGE ScopedTypeVariables #-} 


module NLP.HistPL.Binary.Util
( getUsefulContents
, emptyDirectory
, maybeErr
, maybeT
, maybeErrT
) where


import           Control.Applicative ((<$>))
import           Control.Monad.IO.Class (liftIO, MonadIO)
import           Control.Exception (try, SomeException)
import           Control.Monad.Trans.Maybe (MaybeT (..))
import           System.Directory (getDirectoryContents)


-- | Load the directory contents.
getUsefulContents :: FilePath -> IO [FilePath]
getUsefulContents
    = fmap (filter (`notElem` [".", ".."]))
    . getDirectoryContents


-- | Check if the directory is empty.
emptyDirectory :: FilePath -> IO Bool
emptyDirectory path = null <$> getUsefulContents path


maybeErr :: MonadIO m => IO a -> m (Maybe a)
maybeErr io = do
    r <- liftIO (try io)
    case r of
        Left (_e :: SomeException)  -> return Nothing
        Right x                     -> return (Just x)


maybeT :: Monad m => Maybe a -> MaybeT m a
maybeT = MaybeT . return
{-# INLINE maybeT #-}


maybeErrT :: MonadIO m => IO a -> MaybeT m a
maybeErrT io = do
    r <- liftIO (maybeErr io)
    maybeT r