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.Internal

Description

 
Synopsis

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

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 #

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

Constructors

ProcessEnv 

Fields

newtype 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

Constructors

Address (InChan msg) 

newtype Mailbox msg Source #

Mailbox where a process receives messages. Cannot be shared with other processes; used implicitly by receive and tryReceive.

Since: 0.3.0.0

Constructors

Mailbox (OutChan msg) 

newtype Scope Source #

Token delimiting the lifetime of child processes (threads) created by a process.

Since: 0.3.0.0

Constructors

Scope Scope 

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

data NoMsg Source #

Message type used by processes which do not receive messages.

Since: 0.3.0.0

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

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

wait :: Process msg () Source #

Block until all child processes have terminated.

Since: 0.3.0.0

here :: HasMsg msg => Process msg (Address msg) Source #

Return the current process' 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

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

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