fenv: Add support for suppressing exceptions across a computation.
authorNick Bowler <nbowler@draconx.ca>
Tue, 23 Feb 2010 23:34:02 +0000 (23 18:34 -0500)
committerNick Bowler <nbowler@draconx.ca>
Tue, 23 Feb 2010 23:34:02 +0000 (23 18:34 -0500)
Data/Floating/Environment.hs

index 7aea8e6..74b2015 100644 (file)
@@ -45,7 +45,8 @@ module Data.Floating.Environment (
     -- during the execution of 'fenvEval'.  The easiest way to ensure that this
     -- does not happen is to only use such expressions as the argument to
     -- 'pure'; never as the argument to 'fmap'.
-    fenvEval, withRoundingMode, raiseExceptions, fenvTrace,
+    fenvEval, withRoundingMode, raiseExceptions, holdExceptions,
+    holdExceptions_, fenvTrace,
 
     -- * Direct access to the floating point environment
     -- | Special care must be taken when using these functions.  Modifying the
@@ -245,6 +246,16 @@ raiseExceptions :: [FloatException] -> FEnv a -> FEnv a
 raiseExceptions ex = liftA2 seq $
     FEnv unsafePerformIO (unsafeRaiseExceptions ex)
 
+-- | Save and restore the floating point state across an FEnv computation.
+-- The result includes the exceptions returned during this computation.
+holdExceptions :: FEnv a -> FEnv (a, [FloatException])
+holdExceptions = FEnv unsafePerformIO . fenvEval
+
+-- | Same as 'holdExceptions', except that any exceptions raised during the
+-- computation are discarded.
+holdExceptions_ :: FEnv a -> FEnv a
+holdExceptions_ = fmap fst . holdExceptions
+
 -- | This function is to help with debugging the floating point environment
 -- handling.  @fenvTrace msg x@ constructs an FEnv value containing @x@ that
 -- prints @msg@ (using 'Debug.Trace.trace') whenever the value is extracted.