summaryrefslogtreecommitdiff
path: root/Annex
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2011-10-04 00:34:04 -0400
committerGravatar Joey Hess <joey@kitenet.net>2011-10-04 00:34:04 -0400
commitff21fd4a652cc6516d0e06ab885adf1c93eddced (patch)
treea84f041317fdbdb07377459e725e165e0845b8c0 /Annex
parent1a96d4ab35ed5c2af95a1598620cbbd13bc295b3 (diff)
factor out Annex exception handling module
Diffstat (limited to 'Annex')
-rw-r--r--Annex/Exception.hs27
1 files changed, 27 insertions, 0 deletions
diff --git a/Annex/Exception.hs b/Annex/Exception.hs
new file mode 100644
index 000000000..549ef4fd5
--- /dev/null
+++ b/Annex/Exception.hs
@@ -0,0 +1,27 @@
+{- exception handling in the git-annex monad
+ -
+ - Copyright 2011 Joey Hess <joey@kitenet.net>
+ -
+ - Licensed under the GNU GPL version 3 or higher.
+ -}
+
+module Annex.Exception (
+ bracketIO,
+ handle,
+ throw,
+) where
+
+import Control.Exception.Control (handle)
+import Control.Monad.IO.Control (liftIOOp)
+import Control.Exception hiding (handle, throw)
+
+import AnnexCommon
+
+{- Runs an Annex action, with setup and cleanup both in the IO monad. -}
+bracketIO :: IO c -> (c -> IO b) -> Annex a -> Annex a
+bracketIO setup cleanup go =
+ liftIOOp (Control.Exception.bracket setup cleanup) (const go)
+
+{- Throws an exception in the Annex monad. -}
+throw :: Control.Exception.Exception e => e -> Annex a
+throw = liftIO . throwIO