stateref-0.3: Abstraction for things that work like IORef.

Safe HaskellNone

Data.MRef.Instances

Description

This module exports no new symbols of its own. It defines basic class instances for creating, reading, and writing MVars, and re-exports MVar.

Synopsis

Documentation

data MVar a

An MVar (pronounced "em-var") is a synchronising variable, used for communication between concurrent threads. It can be thought of as a a box, which may be empty or full.

Instances

Eq (MVar a) 
(Monad m, MonadIO m) => PutMRef (MVar a) m a 
(Monad m, MonadIO m) => TakeMRef (MVar a) m a 
(Monad m, MonadIO m) => NewMRef (MVar a) m a 
MonadIO m => NewRef (MVar a) m (Maybe a) 

class Monad m => MonadIO m where

Monads in which IO computations may be embedded. Any monad built by applying a sequence of monad transformers to the IO monad will be an instance of this class.

Instances should satisfy the following laws, which state that liftIO is a transformer of monads:

Methods

liftIO :: IO a -> m a

Lift a computation from the IO monad.

Instances

data STM a

A monad supporting atomic memory transactions.

Instances

Monad STM 
Functor STM 
Typeable1 STM 
MonadFix STM 
MonadPlus STM 
HasMRef STM 
HasRef STM 
Monad STM => PutMRef (TVar (Maybe a)) STM a 
Monad STM => PutMRef (TMVar a) STM a 
Monad STM => TakeMRef (TVar (Maybe a)) STM a 
Monad STM => TakeMRef (TMVar a) STM a 
Monad STM => NewMRef (TVar (Maybe a)) STM a 
Monad STM => NewMRef (TMVar a) STM a 
NewRef (TVar a) STM a 
(ReadRef (TVar a) STM a, WriteRef (TVar a) STM a) => ModifyRef (TVar a) STM a 
MonadIO m => ReadRef (STM a) m a 
ReadRef (STM a) STM a 
ReadRef (TVar a) STM a 
WriteRef (TVar a) STM a 
NewRef (TMVar a) STM (Maybe a) 
ReadRef (TMVar a) STM (Maybe a) 
Monad IO => PutMRef (MRef STM a) IO a 
Monad IO => TakeMRef (MRef STM a) IO a 
Monad IO => NewMRef (MRef STM a) IO a 
MonadIO m => NewRef (Ref STM a) m a 
(ReadRef (Ref STM a) m a, WriteRef (Ref STM a) m a, MonadIO m) => ModifyRef (Ref STM a) m a 
MonadIO m => ReadRef (Ref STM a) m a 
MonadIO m => WriteRef (Ref STM a) m a 

data TMVar a

A TMVar is a synchronising variable, used for communication between concurrent threads. It can be thought of as a box, which may be empty or full.

Instances

Typeable1 TMVar 
Eq (TMVar a) 
Monad IO => PutMRef (TMVar a) IO a 
Monad STM => PutMRef (TMVar a) STM a 
Monad IO => TakeMRef (TMVar a) IO a 
Monad STM => TakeMRef (TMVar a) STM a 
Monad IO => NewMRef (TMVar a) IO a 
Monad STM => NewMRef (TMVar a) STM a 
MonadIO m => NewRef (TMVar a) m (Maybe a) 
NewRef (TMVar a) STM (Maybe a) 
MonadIO m => ReadRef (TMVar a) m (Maybe a) 
ReadRef (TMVar a) STM (Maybe a) 

data TVar a

Shared memory locations that support atomic memory transactions.

Instances

Typeable1 TVar 
Eq (TVar a) 
Monad IO => PutMRef (TVar (Maybe a)) IO a 
Monad STM => PutMRef (TVar (Maybe a)) STM a 
Monad IO => TakeMRef (TVar (Maybe a)) IO a 
Monad STM => TakeMRef (TVar (Maybe a)) STM a 
Monad IO => NewMRef (TVar (Maybe a)) IO a 
Monad STM => NewMRef (TVar (Maybe a)) STM a 
MonadIO m => NewRef (TVar a) m a 
NewRef (TVar a) STM a 
(ReadRef (TVar a) m a, WriteRef (TVar a) m a, MonadIO m) => ModifyRef (TVar a) m a 
(ReadRef (TVar a) STM a, WriteRef (TVar a) STM a) => ModifyRef (TVar a) STM a 
MonadIO m => ReadRef (TVar a) m a 
ReadRef (TVar a) STM a 
MonadIO m => WriteRef (TVar a) m a 
WriteRef (TVar a) STM a 

atomically :: STM a -> IO a

Perform a series of STM actions atomically.

You cannot use atomically inside an unsafePerformIO or unsafeInterleaveIO. Any attempt to do so will result in a runtime error. (Reason: allowing this would effectively allow a transaction inside a transaction, depending on exactly when the thunk is evaluated.)

However, see newTVarIO, which can be called inside unsafePerformIO, and which allows top-level TVars to be allocated.