Copyright | © 2021 Evan Relf |
---|---|
License | BSD-3-Clause |
Maintainer | evan@evanrelf.com |
Stability | experimental |
Safe Haskell | None |
Language | Haskell2010 |
Synopsis
- data Process msg a
- spawn :: HasMsg msg => Process msg () -> Process _msg (Address msg)
- wait :: Process msg ()
- data Address msg
- send :: HasMsg msg => Address msg -> msg -> Process _msg ()
- here :: HasMsg msg => Process msg (Address msg)
- receive :: HasMsg msg => Process msg msg
- tryReceive :: HasMsg msg => Process msg (Maybe msg)
- run :: (HasMsg msg, MonadIO m) => Process msg a -> m a
- data NoMsg
- spawn_ :: Process NoMsg () -> Process msg ()
- run_ :: MonadIO m => Process NoMsg a -> m a
- type family HasMsg msg :: Constraint where ...
- liftIO :: MonadIO m => IO a -> m a
Documentation
Monad supporting actor operations. Inspired by Elixir and Erlang's processes.
Since: 0.3.0.0
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 # | |
Spawning processes
:: 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
Sending messages
Send a message to another process.
Since: 0.3.0.0
here :: HasMsg msg => Process msg (Address msg) Source #
Return the current process' address.
Since: 0.3.0.0
Receiving messages
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
Running your program
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
Not receiving messages
type family HasMsg msg :: Constraint where ... Source #
Constraint which prevents setting `msg ~ Void`, and provides helpful type errors.
Since: 0.3.0.0
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 = () |