drama-0.3.0.0: Actor library for Haskell
Copyright© 2021 Evan Relf
LicenseBSD-3-Clause
Maintainerevan@evanrelf.com
Stabilityexperimental
Safe HaskellNone
LanguageHaskell2010

Drama.Process

Description

Lower-level processes, supporting spawn, send, receive and other related operations. Inspired by Elixir and Erlang's processes.

Synopsis

Documentation

data Process msg a Source #

Monad supporting actor operations. Inspired by Elixir and Erlang's processes.

Since: 0.3.0.0

Instances

Instances details
Monad (Process msg) Source # 
Instance details

Defined in Drama.Process.Internal

Methods

(>>=) :: Process msg a -> (a -> Process msg b) -> Process msg b #

(>>) :: Process msg a -> Process msg b -> Process msg b #

return :: a -> Process msg a #

Functor (Process msg) Source # 
Instance details

Defined in Drama.Process.Internal

Methods

fmap :: (a -> b) -> Process msg a -> Process msg b #

(<$) :: a -> Process msg b -> Process msg a #

MonadFix (Process msg) Source # 
Instance details

Defined in Drama.Process.Internal

Methods

mfix :: (a -> Process msg a) -> Process msg a #

MonadFail (Process msg) Source # 
Instance details

Defined in Drama.Process.Internal

Methods

fail :: String -> Process msg a #

Applicative (Process msg) Source # 
Instance details

Defined in Drama.Process.Internal

Methods

pure :: a -> Process msg a #

(<*>) :: Process msg (a -> b) -> Process msg a -> Process msg b #

liftA2 :: (a -> b -> c) -> Process msg a -> Process msg b -> Process msg c #

(*>) :: Process msg a -> Process msg b -> Process msg b #

(<*) :: Process msg a -> Process msg b -> Process msg a #

MonadIO (Process msg) Source # 
Instance details

Defined in Drama.Process.Internal

Methods

liftIO :: IO a -> Process msg a #

Alternative (Process msg) Source # 
Instance details

Defined in Drama.Process.Internal

Methods

empty :: Process msg a #

(<|>) :: Process msg a -> Process msg a -> Process msg a #

some :: Process msg a -> Process msg [a] #

many :: Process msg a -> Process msg [a] #

MonadPlus (Process msg) Source # 
Instance details

Defined in Drama.Process.Internal

Methods

mzero :: Process msg a #

mplus :: Process msg a -> Process msg a -> Process msg a #

Spawning processes

spawn Source #

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

wait :: Process msg () Source #

Block until all child processes have terminated.

Since: 0.3.0.0

Sending messages

data Address msg Source #

Address for sending messages to a process. Obtained by running spawn, here, or receive (if another process sends you an address).

Since: 0.3.0.0

send Source #

Arguments

:: HasMsg msg 
=> Address msg

Other process' address

-> msg

Message to send

-> Process _msg () 

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

data NoMsg Source #

Message type used by processes which do not receive messages.

Since: 0.3.0.0

spawn_ :: Process NoMsg () -> Process msg () Source #

More efficient version of spawn, for processes which receive no messages (msg ~ NoMsg). See docs for spawn for more information.

Since: 0.3.0.0

run_ :: MonadIO m => Process NoMsg a -> m a Source #

More efficient version of run, for processes which receive no messages (msg ~ NoMsg). See docs for run for more information.

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 = () 

Re-exports

liftIO :: MonadIO m => IO a -> m a #

Lift a computation from the IO monad.