packages feed

carboncopy-0.1: CarbonCopy/EmailStorage.hs

module CarbonCopy.EmailStorage (EmailHandler, visitEmailsRecursively) where

import Control.Monad
import System.IO.HVFS
import System.FilePath.Posix
import Data.ByteString.Char8 as BStr

import Prelude as P

type EmailHandler = ByteString -> IO ()

(?:) :: IO (Bool) -> ( IO (), IO () ) -> IO ()
(?:) cond (actL,actR) = cond >>= \condExp -> if condExp then actL else actR

(?&) :: IO (Bool) -> IO () -> IO ()
(?&) cond act = cond ?: ( act, return () )

visitEmailsRecursively :: FilePath -> EmailHandler -> IO ()
visitEmailsRecursively dir emailHandler =
    vGetDirectoryContents SystemFS dir >>= mapM_ processDirectory . P.filter (not . flip P.elem [".",".."] )
        where 
            processDirectory _path = fileExists ?: 
                                        ( BStr.readFile filePath >>= emailHandler, 
                                          dirExists ?& visitEmailsRecursively newDir emailHandler
                                        )
                where
                    filePath = dir </> _path
                    fileExists = vDoesFileExist SystemFS filePath
                    dirExists = vDoesDirectoryExist SystemFS filePath
                    newDir = addTrailingPathSeparator filePath