Copyright | (c) Roman Leshchinskiy 2009 |
---|---|

License | BSD-style |

Maintainer | Roman Leshchinskiy <rl@cse.unsw.edu.au> |

Portability | non-portable |

Safe Haskell | None |

Language | Haskell2010 |

Primitive state-transformer monads

## Synopsis

- class Monad m => PrimMonad m where
- data RealWorld
- primitive_ :: PrimMonad m => (State# (PrimState m) -> State# (PrimState m)) -> m ()
- class PrimMonad m => PrimBase m where
- class (PrimMonad m, s ~ PrimState m) => MonadPrim s m
- class (PrimBase m, MonadPrim s m) => MonadPrimBase s m
- liftPrim :: (PrimBase m1, PrimMonad m2, PrimState m1 ~ PrimState m2) => m1 a -> m2 a
- primToPrim :: (PrimBase m1, PrimMonad m2, PrimState m1 ~ PrimState m2) => m1 a -> m2 a
- primToIO :: (PrimBase m, PrimState m ~ RealWorld) => m a -> IO a
- primToST :: PrimBase m => m a -> ST (PrimState m) a
- ioToPrim :: (PrimMonad m, PrimState m ~ RealWorld) => IO a -> m a
- stToPrim :: PrimMonad m => ST (PrimState m) a -> m a
- unsafePrimToPrim :: (PrimBase m1, PrimMonad m2) => m1 a -> m2 a
- unsafePrimToIO :: PrimBase m => m a -> IO a
- unsafePrimToST :: PrimBase m => m a -> ST s a
- unsafeIOToPrim :: PrimMonad m => IO a -> m a
- unsafeSTToPrim :: PrimMonad m => ST s a -> m a
- unsafeInlinePrim :: PrimBase m => m a -> a
- unsafeInlineIO :: IO a -> a
- unsafeInlineST :: ST s a -> a
- touch :: PrimMonad m => a -> m ()
- evalPrim :: forall a m. PrimMonad m => a -> m a
- unsafeInterleave :: PrimBase m => m a -> m a
- unsafeDupableInterleave :: PrimBase m => m a -> m a
- noDuplicate :: PrimMonad m => m ()

# Documentation

class Monad m => PrimMonad m where Source #

Class of monads which can perform primitive state-transformer actions

primitive :: (State# (PrimState m) -> (# State# (PrimState m), a #)) -> m a Source #

Execute a primitive operation

#### Instances

`RealWorld`

is deeply magical. It is *primitive*, but it is not
*unlifted* (hence `ptrArg`

). We never manipulate values of type
`RealWorld`

; it's only used in the type system, to parameterise `State#`

.

primitive_ :: PrimMonad m => (State# (PrimState m) -> State# (PrimState m)) -> m () Source #

Execute a primitive operation with no result

class PrimMonad m => PrimBase m where Source #

Class of primitive monads for state-transformer actions.

Unlike `PrimMonad`

, this typeclass requires that the `Monad`

be fully
expressed as a state transformer, therefore disallowing other monad
transformers on top of the base `IO`

or `ST`

.

*Since: 0.6.0.0*

internal :: m a -> State# (PrimState m) -> (# State# (PrimState m), a #) Source #

Expose the internal structure of the monad

class (PrimMonad m, s ~ PrimState m) => MonadPrim s m Source #

class (PrimBase m, MonadPrim s m) => MonadPrimBase s m Source #

`PrimBase'`

s state token type can be annoying to handle
in constraints. This typeclass lets users (visually) notice
`PrimState`

equality constraints less, by witnessing that
`s ~ `

.`PrimState`

m

#### Instances

(PrimBase m, MonadPrim s m) => MonadPrimBase s m Source # | |

Defined in Control.Monad.Primitive |

primToPrim :: (PrimBase m1, PrimMonad m2, PrimState m1 ~ PrimState m2) => m1 a -> m2 a Source #

Convert a `PrimBase`

to another monad with the same state token.

unsafePrimToPrim :: (PrimBase m1, PrimMonad m2) => m1 a -> m2 a Source #

Convert a `PrimBase`

to another monad with a possibly different state
token. This operation is highly unsafe!

unsafePrimToIO :: PrimBase m => m a -> IO a Source #

unsafePrimToST :: PrimBase m => m a -> ST s a Source #

unsafeIOToPrim :: PrimMonad m => IO a -> m a Source #

unsafeSTToPrim :: PrimMonad m => ST s a -> m a Source #

unsafeInlinePrim :: PrimBase m => m a -> a Source #

See `unsafeInlineIO`

. This function is not recommended for the same
reasons.

unsafeInlineIO :: IO a -> a Source #

Generally, do not use this function. It is the same as
`accursedUnutterablePerformIO`

from `bytestring`

and is well behaved under
narrow conditions. See the documentation of that function to get an idea
of when this is sound. In most cases `GHC.IO.Unsafe.unsafeDupablePerformIO`

should be preferred.

unsafeInlineST :: ST s a -> a Source #

See `unsafeInlineIO`

. This function is not recommended for the same
reasons. Prefer `runST`

when `s`

is free.

evalPrim :: forall a m. PrimMonad m => a -> m a Source #

Create an action to force a value; generalizes `evaluate`

*Since: 0.6.2.0*

unsafeInterleave :: PrimBase m => m a -> m a Source #

unsafeDupableInterleave :: PrimBase m => m a -> m a Source #

noDuplicate :: PrimMonad m => m () Source #