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 :: Type
- primitive_ :: PrimMonad m => (State# (PrimState m) -> State# (PrimState m)) -> m ()
- class PrimMonad m => PrimBase m where
- 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
- unsafePrimToPrim :: (PrimBase m1, PrimMonad m2) => m1 a -> m2 a
- unsafePrimToIO :: PrimBase m => m a -> IO a
- unsafePrimToST :: PrimBase m => m a -> ST s a
- unsafeInlinePrim :: PrimBase m => m a -> a
- unsafeInlineIO :: IO a -> a
- unsafeInlineST :: ST s a -> a
- touch :: PrimMonad m => a -> 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

PrimMonad IO Source # | |

PrimMonad (ST s) Source # | |

PrimMonad m => PrimMonad (MaybeT m) Source # | |

PrimMonad m => PrimMonad (ListT m) Source # | |

(Monoid w, PrimMonad m) => PrimMonad (WriterT w m) Source # | |

(Monoid w, PrimMonad m) => PrimMonad (WriterT w m) Source # | |

PrimMonad m => PrimMonad (StateT s m) Source # | |

PrimMonad m => PrimMonad (StateT s m) Source # | |

PrimMonad m => PrimMonad (IdentityT m) Source # | |

PrimMonad m => PrimMonad (ExceptT e m) Source # | |

(Error e, PrimMonad m) => PrimMonad (ErrorT e m) Source # | |

PrimMonad m => PrimMonad (ReaderT r m) Source # | |

(Monoid w, PrimMonad m) => PrimMonad (RWST r w s m) Source # | |

(Monoid w, PrimMonad m) => PrimMonad (RWST r w s m) Source # | |

`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`

.

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

Expose the internal structure of the monad

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 #

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

unsafeInlineIO :: IO a -> a Source #

unsafeInlineST :: ST s a -> a Source #