    -----------------------------------------------------------------------------
    -- |
    -- Module      :  Control.Monad.STM
    -- Copyright   :  (c) The University of Glasgow 2004
    -- License     :  BSD-style (see the file libraries/base/LICENSE)
    --
    -- Maintainer  :  libraries@haskell.org
    -- Stability   :  experimental
    -- Portability :  non-portable (requires STM)
    --
    -- Software Transactional Memory: a modular composable concurrency
    -- abstraction.  See
    --
    --  * /Composable memory transactions/, by Tim Harris, Simon Marlow, Simon
    --    Peyton Jones, and Maurice Herlihy, in /ACM Conference on Principles
    --    and Practice of Parallel Programming/ 2005.
    --    <http://research.microsoft.com/Users/simonpj/papers/stm/index.htm>
    --
    -- This module only defines the 'STM' monad; you probably want to
    -- import "Control.Concurrent.STM" (which exports "Control.Monad.STM").
    -----------------------------------------------------------------------------

    module Control.Monad.STM (
      	STM,
    	atomically,
    #ifdef __GLASGOW_HASKELL__
            always,
            alwaysSucceeds,
    	retry,
    	orElse,
    	check,
    #endif
            catchSTM
      ) where

    #ifdef __GLASGOW_HASKELL__
    import GHC.Conc
    import Control.Monad	( MonadPlus(..) )
    #else
    import Control.Sequential.STM
    #endif

    #ifdef __GLASGOW_HASKELL__
    instance MonadPlus STM where
      mzero = retry
      mplus = orElse

    check :: Bool -> STM a
    check b = if b then return undefined else retry
    #endif