diff options
Diffstat (limited to 'Utility')
-rw-r--r-- | Utility/Misc.hs | 21 | ||||
-rw-r--r-- | Utility/TempFile.hs | 4 |
2 files changed, 21 insertions, 4 deletions
diff --git a/Utility/Misc.hs b/Utility/Misc.hs index 4c4aa4c93..728598723 100644 --- a/Utility/Misc.hs +++ b/Utility/Misc.hs @@ -8,7 +8,9 @@ module Utility.Misc where import System.IO +import System.IO.Error (try) import Control.Monad +import Control.Applicative {- A version of hgetContents that is not lazy. Ensures file is - all read before it gets closed. -} @@ -26,5 +28,20 @@ readMaybe s = case reads s of _ -> Nothing {- Catches IO errors and returns a Bool -} -catchBool :: IO Bool -> IO Bool -catchBool = flip catch (const $ return False) +catchBoolIO :: IO Bool -> IO Bool +catchBoolIO a = catchDefaultIO a False + +{- Catches IO errors and returns a Maybe -} +catchMaybeIO :: IO a -> IO (Maybe a) +catchMaybeIO a = catchDefaultIO (Just <$> a) Nothing + +{- Catches IO errors and returns a default value. -} +catchDefaultIO :: IO a -> a -> IO a +catchDefaultIO a def = catch a (const $ return def) + +{- Catches IO errors and returns the error message. -} +catchMsgIO :: IO a -> IO (Either String a) +catchMsgIO a = dispatch <$> try a + where + dispatch (Left e) = Left $ show e + dispatch (Right v) = Right v diff --git a/Utility/TempFile.hs b/Utility/TempFile.hs index 1e823c10e..8d50dd8b2 100644 --- a/Utility/TempFile.hs +++ b/Utility/TempFile.hs @@ -31,9 +31,9 @@ withTempFile :: String -> (FilePath -> Handle -> IO a) -> IO a withTempFile template a = bracket create remove use where create = do - tmpdir <- catch getTemporaryDirectory (const $ return ".") + tmpdir <- catchDefaultIO getTemporaryDirectory "." openTempFile tmpdir template remove (name, handle) = do hClose handle - catchBool (removeFile name >> return True) + catchBoolIO (removeFile name >> return True) use (name, handle) = a name handle |