remote-monad-0.2: An parametrizable Remote Monad, and parametrizable Applicative Functor

Copyright(C) 2016, The University of Kansas
LicenseBSD-style (see the file LICENSE)
MaintainerAndy Gill
StabilityAlpha
PortabilityGHC
Safe HaskellSafe
LanguageHaskell2010

Control.Remote.Monad

Contents

Description

 

Synopsis

The remote monad

data RemoteMonad c p a Source

RemoteMonad is our monad that can be executed in a remote location.

The primitive lift functions

command :: c -> RemoteMonad c p () Source

promote a command into the remote monad

procedure :: p a -> RemoteMonad c p a Source

promote a procedure into the remote monad

The run functions

class RunMonad f where Source

RunMonad is the overloading for choosing the appropriate bundling strategy for a monad.

Methods

runMonad :: Monad m => (f c p :~> m) -> RemoteMonad c p :~> m Source

This overloaded function chooses the appropriate bundling strategy based on the type of the handler your provide.

runWeakMonad :: Monad m => (WeakPacket c p :~> m) -> RemoteMonad c p :~> m Source

This is the classic weak remote monad, or technically the weak remote applicative weak remote monad.

runStrongMonad :: forall m c p. Monad m => (StrongPacket c p :~> m) -> RemoteMonad c p :~> m Source

This is the classic strong remote monad. It bundles packets (of type StrongPacket) as large as possible, including over some monadic binds.

runApplicativeMonad :: forall m c p. Monad m => (ApplicativePacket c p :~> m) -> RemoteMonad c p :~> m Source

The is the strong applicative strong remote monad. It bundles packets (of type RemoteApplicative) as large as possible, including over some monadic binds.

runMonadSkeleton :: Monad m => (RemoteApplicative c p :~> m) -> RemoteMonad c p :~> m Source

This is a remote monad combinator, that takes an implementation of a remote applicative, splits the monad into applicatives without any merge stragegy, and uses the remote applicative. Every >>= will generate a call to the RemoteApplicative handler; as well as one terminating call. Using runBindeeMonad with a runWeakApplicative gives the weakest remote monad.