{-# LANGUAGE CPP #-}
{-# OPTIONS_HADDOCK hide #-}
module Graphics.Rendering.OpenGL.GL.Exception (
bracket, bracket_, unsafeBracket_, finallyRet
) where
import Data.IORef ( newIORef, readIORef, writeIORef )
#ifdef __NHC__
import qualified IO ( bracket, bracket_ )
{-# INLINE bracket #-}
bracket :: IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket = IO.bracket
{-# INLINE bracket_ #-}
bracket_ :: IO a -> IO b -> IO c -> IO c
bracket_ before = IO.bracket_ before . const
finally :: IO a -> IO b -> IO a
finally = flip . bracket_ . return $ undefined
#else
import Control.Exception ( bracket, bracket_, finally )
#endif
{-# INLINE unsafeBracket_ #-}
unsafeBracket_ :: IO a -> IO b -> IO c -> IO c
unsafeBracket_ :: forall a b c. IO a -> IO b -> IO c -> IO c
unsafeBracket_ IO a
before IO b
after IO c
thing = do
a
_ <- IO a
before
c
r <- IO c
thing
b
_ <- IO b
after
c -> IO c
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return c
r
{-# INLINE finallyRet #-}
finallyRet :: IO a -> IO b -> IO (a, b)
IO a
a finallyRet :: forall a b. IO a -> IO b -> IO (a, b)
`finallyRet` IO b
sequel = do
IORef b
r2Ref <- b -> IO (IORef b)
forall a. a -> IO (IORef a)
newIORef b
forall a. HasCallStack => a
undefined
a
r1 <- IO a
a IO a -> IO () -> IO a
forall a b. IO a -> IO b -> IO a
`finally` (IO b
sequel IO b -> (b -> IO ()) -> IO ()
forall a b. IO a -> (a -> IO b) -> IO b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= IORef b -> b -> IO ()
forall a. IORef a -> a -> IO ()
writeIORef IORef b
r2Ref)
b
r2 <- IORef b -> IO b
forall a. IORef a -> IO a
readIORef IORef b
r2Ref
(a, b) -> IO (a, b)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return (a
r1, b
r2)