Copyright | © 2021 Evan Relf |
---|---|
License | BSD-3-Clause |
Maintainer | evan@evanrelf.com |
Stability | experimental |
Safe Haskell | None |
Language | Haskell2010 |
Drama.Process.Internal
Description
Synopsis
- newtype Process msg a = Process (ReaderT (ProcessEnv msg) IO a)
- runProcess :: MonadIO m => ProcessEnv msg -> Process msg a -> m a
- data ProcessEnv msg = ProcessEnv {}
- newtype Address msg = Address (InChan msg)
- newtype Mailbox msg = Mailbox (OutChan msg)
- newtype Scope = Scope Scope
- type family HasMsg msg :: Constraint where ...
- data NoMsg
- spawn :: HasMsg msg => Process msg () -> Process _msg (Address msg)
- spawn_ :: Process NoMsg () -> Process msg ()
- wait :: Process msg ()
- here :: HasMsg msg => Process msg (Address msg)
- send :: HasMsg msg => Address msg -> msg -> Process _msg ()
- receive :: HasMsg msg => Process msg msg
- tryReceive :: HasMsg msg => Process msg (Maybe msg)
- run :: (HasMsg msg, MonadIO m) => Process msg a -> m a
- run_ :: MonadIO m => Process NoMsg a -> m a
Documentation
newtype Process msg a Source #
Monad supporting actor operations. Inspired by Elixir and Erlang's processes.
Since: 0.3.0.0
Constructors
Process (ReaderT (ProcessEnv msg) IO a) |
Instances
Monad (Process msg) Source # | |
Functor (Process msg) Source # | |
MonadFix (Process msg) Source # | |
Defined in Drama.Process.Internal | |
MonadFail (Process msg) Source # | |
Defined in Drama.Process.Internal | |
Applicative (Process msg) Source # | |
Defined in Drama.Process.Internal | |
MonadIO (Process msg) Source # | |
Defined in Drama.Process.Internal | |
Alternative (Process msg) Source # | |
MonadPlus (Process msg) Source # | |
runProcess :: MonadIO m => ProcessEnv msg -> Process msg a -> m a Source #
Provided some ProcessEnv
, convert a Process
action into an IO
action.
Since: 0.3.0.0
data ProcessEnv msg Source #
Ambient context provided by the Process
monad.
Values in ProcessEnv
are scoped to the current process and cannot be safely
shared. Functions like spawn
, receive
, and here
use these values as
implicit parameters to avoid leaking internals (and for convenience).
Since: 0.3.0.0
Mailbox where a process receives messages. Cannot be shared with other
processes; used implicitly by receive
and tryReceive
.
Since: 0.3.0.0
Token delimiting the lifetime of child processes (threads) created by a process.
Since: 0.3.0.0
type family HasMsg msg :: Constraint where ... Source #
Constraint which prevents setting `msg ~ Void`, and provides helpful type errors.
Since: 0.3.0.0
Equations
HasMsg NoMsg = TypeError ('Text "Processes with 'msg ~ NoMsg' cannot receive messages") | |
HasMsg Void = TypeError ('Text "Use 'msg ~ NoMsg' instead of 'msg ~ Void' for processes which do not receive messages") | |
HasMsg () = TypeError ('Text "Use 'msg ~ NoMsg' instead of 'msg ~ ()' for processes which do not receive messages") | |
HasMsg msg = () |
Arguments
:: HasMsg msg | |
=> Process msg () | Process to spawn |
-> Process _msg (Address msg) | Spawned process' address |
Spawn a child process and return its address.
Since: 0.3.0.0
here :: HasMsg msg => Process msg (Address msg) Source #
Return the current process' address.
Since: 0.3.0.0
Send a message to another process.
Since: 0.3.0.0
receive :: HasMsg msg => Process msg msg Source #
Receive a message. When the mailbox is empty, blocks until a message arrives.
Since: 0.3.0.0
tryReceive :: HasMsg msg => Process msg (Maybe msg) Source #
Try to receive a message. When the mailbox is empty, returns Nothing
.
Since: 0.3.0.0
run :: (HasMsg msg, MonadIO m) => Process msg a -> m a Source #
Run a top-level process. Intended to be used at the entry point of your program.
If your program is designed with processes in mind, you can use Process
as
your program's base monad:
main :: IO () main = run do ...
Otherwise, use run
like you would with run
functions from libraries like
transformers
or mtl
.
Since: 0.3.0.0