module Control.Monad.IO.MonadIOException where

import Control.Monad.IO.Unwrappable
import Control.Monad.IO.Class
import Control.Exception

bracketIO :: MonadIOUnwrappable m d e => IO a -> (a -> IO b) -> (a -> m c) -> m c
bracketIO init cleanup action = do
  s <- unwrapState
  r <- liftIO $ bracket init cleanup (\x -> unwrapMonadIO s (action x))
  rewrapMonadIO s r