{-# LANGUAGE MagicHash, DeriveDataTypeable #-}

import Control.Exception
import Control.Concurrent.STM hiding (catchSTM)
import Data.Data
import Data.Maybe
import Data.Typeable

import GHC.Prim (raiseIO#)
import qualified GHC.Conc as C
import GHC.Conc (STM(..))

throwSTM :: Exception e => e -> STM a
throwSTM = STM . raiseIO# . toException

catchSTM :: Exception e => (STM a) -> (e -> STM a) -> STM a
catchSTM stm h = C.catchSTM stm (h . fromJust . fromException . toException)

data DummyException = DummyException
 deriving (Data,Typeable,Show)

instance Exception DummyException

test1 = throwSTM DummyException

test2 = catchSTM test1 $ \DummyException -> return 5

