extensible-effects-concurrent-0.21.1: Message passing concurrency as extensible-effect

Safe HaskellNone
LanguageHaskell2010

Control.Eff.Concurrent.Api.Server

Contents

Description

Support code to implement Api _server_ processes.

Since: 0.16.0

Synopsis

Starting Api Servers

spawnApiServer :: forall api eff. (ToServerPids api, HasCallStack) => MessageCallback api (InterruptableProcess eff) -> InterruptCallback (ConsProcess eff) -> Eff (InterruptableProcess eff) (ServerPids api) Source #

Serve an Api in a newly spawned process.

Since: 0.13.2

spawnLinkApiServer :: forall api eff. (ToServerPids api, HasCallStack) => MessageCallback api (InterruptableProcess eff) -> InterruptCallback (ConsProcess eff) -> Eff (InterruptableProcess eff) (ServerPids api) Source #

Serve an Api in a newly spawned -and linked - process.

Since: 0.14.2

spawnApiServerStateful :: forall api eff state. (HasCallStack, ToServerPids api) => Eff (InterruptableProcess eff) state -> MessageCallback api (State state ': InterruptableProcess eff) -> InterruptCallback (State state ': ConsProcess eff) -> Eff (InterruptableProcess eff) (ServerPids api) Source #

Server an Api in a newly spawned process; the callbacks have access to some state initialed by the function in the first parameter.

Since: 0.13.2

spawnApiServerEffectful :: forall api eff serverEff. (HasCallStack, ToServerPids api, Member Interrupts serverEff, SetMember Process (Process eff) serverEff) => (forall b. Eff serverEff b -> Eff (InterruptableProcess eff) b) -> MessageCallback api serverEff -> InterruptCallback serverEff -> Eff (InterruptableProcess eff) (ServerPids api) Source #

Server an Api in a newly spawned process; The caller provides an effect handler for arbitrary effects used by the server callbacks.

Since: 0.13.2

spawnLinkApiServerEffectful :: forall api eff serverEff. (HasCallStack, ToServerPids api, Member Interrupts serverEff, SetMember Process (Process eff) serverEff) => (forall b. Eff serverEff b -> Eff (InterruptableProcess eff) b) -> MessageCallback api serverEff -> InterruptCallback serverEff -> Eff (InterruptableProcess eff) (ServerPids api) Source #

Server an Api in a newly spawned process; The caller provides an effect handler for arbitrary effects used by the server callbacks. Links to the calling process like linkProcess would.

Since: 0.14.2

apiServerLoop :: forall api eff serverEff. (HasCallStack, ToServerPids api, Member Interrupts serverEff, SetMember Process (Process eff) serverEff) => MessageCallback api serverEff -> InterruptCallback serverEff -> Eff serverEff () Source #

Receive loop for Api calls. This starts a receive loop for a MessageCallback. It is used behind the scenes by spawnLinkApiServerEffectful and spawnApiServerEffectful.

Since: 0.14.2

Api Server Callbacks

data CallbackResult where Source #

A command to the server loop started by apiServerLoop. Typically returned by a MessageCallback to indicate if the server should continue or stop.

Since: 0.13.2

Constructors

AwaitNext :: CallbackResult

Tell the server to keep the server loop running

StopServer :: InterruptReason -> CallbackResult

Tell the server to exit, this will cause apiServerLoop to stop handling requests without exiting the process.

data MessageCallback api eff where Source #

An existential wrapper around a MessageSelector and a function that handles the selected message. The api type parameter is a phantom type.

The return value if the handler function is a CallbackResult.

Since: 0.13.2

Constructors

MessageCallback :: MessageSelector a -> (a -> Eff eff CallbackResult) -> MessageCallback api eff 
Instances
Semigroup (MessageCallback api eff) Source # 
Instance details

Defined in Control.Eff.Concurrent.Api.Server

Methods

(<>) :: MessageCallback api eff -> MessageCallback api eff -> MessageCallback api eff #

sconcat :: NonEmpty (MessageCallback api eff) -> MessageCallback api eff #

stimes :: Integral b => b -> MessageCallback api eff -> MessageCallback api eff #

Monoid (MessageCallback api eff) Source # 
Instance details

Defined in Control.Eff.Concurrent.Api.Server

Methods

mempty :: MessageCallback api eff #

mappend :: MessageCallback api eff -> MessageCallback api eff -> MessageCallback api eff #

mconcat :: [MessageCallback api eff] -> MessageCallback api eff #

Default (MessageCallback api eff) Source # 
Instance details

Defined in Control.Eff.Concurrent.Api.Server

Methods

def :: MessageCallback api eff #

Callback Smart Constructors

Calls and Casts (for Apis)

handleCasts :: forall api eff. (HasCallStack, Typeable api, Typeable (Api api Asynchronous)) => (Api api Asynchronous -> Eff eff CallbackResult) -> MessageCallback api eff Source #

A smart constructor for MessageCallbacks

Since: 0.13.2

handleCalls :: forall api eff effScheduler. (HasCallStack, Typeable api, SetMember Process (Process effScheduler) eff, Member Interrupts eff) => (forall secret reply. (Typeable reply, Typeable (Api api (Synchronous reply))) => Api api (Synchronous reply) -> (Eff eff (Maybe reply, CallbackResult) -> secret) -> secret) -> MessageCallback api eff Source #

A smart constructor for MessageCallbacks

Example

Expand
handleCalls
  ( (RentBook bookId customerId) runCall ->
     runCall $ do
         rentalIdE <- rentBook bookId customerId
         case rentalIdE of
           -- on fail we just don't send a reply, let the caller run into
           -- timeout
           Left err -> return (Nothing, AwaitNext)
           Right rentalId -> return (Just rentalId, AwaitNext))

Since: 0.13.2

handleCastsAndCalls :: forall api eff effScheduler. (HasCallStack, Typeable api, Typeable (Api api Asynchronous), SetMember Process (Process effScheduler) eff, Member Interrupts eff) => (Api api Asynchronous -> Eff eff CallbackResult) -> (forall secret reply. (Typeable reply, Typeable (Api api (Synchronous reply))) => Api api (Synchronous reply) -> (Eff eff (Maybe reply, CallbackResult) -> secret) -> secret) -> MessageCallback api eff Source #

A smart constructor for MessageCallbacks

Since: 0.13.2

handleCallsDeferred :: forall api eff effScheduler. (HasCallStack, Typeable api, SetMember Process (Process effScheduler) eff, Member Interrupts eff) => (forall reply. (Typeable reply, Typeable (Api api (Synchronous reply))) => RequestOrigin (Api api (Synchronous reply)) -> Api api (Synchronous reply) -> Eff eff CallbackResult) -> MessageCallback api eff Source #

A variation of handleCalls that allows to defer a reply to a call.

Since: 0.14.2

Generic Message Handler

handleMessages :: forall eff a. (HasCallStack, NFData a, Typeable a) => (a -> Eff eff CallbackResult) -> MessageCallback '[] eff Source #

A smart constructor for MessageCallbacks

Since: 0.13.2

handleSelectedMessages :: forall eff a. HasCallStack => MessageSelector a -> (a -> Eff eff CallbackResult) -> MessageCallback '[] eff Source #

A smart constructor for MessageCallbacks

Since: 0.13.2

handleAnyMessages :: forall eff. HasCallStack => (Dynamic -> Eff eff CallbackResult) -> MessageCallback '[] eff Source #

A smart constructor for MessageCallbacks

Since: 0.13.2

handleProcessDowns :: forall eff. HasCallStack => (MonitorReference -> Eff eff CallbackResult) -> MessageCallback '[] eff Source #

A smart constructor for MessageCallbacks

Since: 0.13.2

Fallback Handler

dropUnhandledMessages :: forall eff. HasCallStack => MessageCallback '[] eff Source #

A fallbackHandler that drops the left-over messages.

Since: 0.13.2

exitOnUnhandled :: forall eff. HasCallStack => MessageCallback '[] eff Source #

A fallbackHandler that terminates if there are unhandled messages.

Since: 0.13.2

logUnhandledMessages :: forall eff. (Member Logs eff, HasCallStack) => MessageCallback '[] eff Source #

A fallbackHandler that drops the left-over messages.

Since: 0.13.2

Api Composition

(^:) :: forall (api1 :: Type) (apis2 :: [Type]) eff. HasCallStack => MessageCallback api1 eff -> MessageCallback apis2 eff -> MessageCallback (api1 ': apis2) eff infixr 5 Source #

Compose two Apis to a type-level pair of them.

handleCalls api1calls ^: handleCalls api2calls ^:

Since: 0.13.2

fallbackHandler :: forall api eff. HasCallStack => MessageCallback api eff -> MessageCallback '[] eff Source #

Make a fallback handler, i.e. a handler to which no other can be composed to from the right.

Since: 0.13.2

class ToServerPids (t :: k) where Source #

Helper type class for the return values of spawnApiServer et al.

Since: 0.13.2

Associated Types

type ServerPids t Source #

Methods

toServerPids :: proxy t -> ProcessId -> ServerPids t Source #

Instances
ToServerPids api1 => ToServerPids (api1 :: Type) Source # 
Instance details

Defined in Control.Eff.Concurrent.Api.Server

Associated Types

type ServerPids api1 :: Type Source #

Methods

toServerPids :: proxy api1 -> ProcessId -> ServerPids api1 Source #

ToServerPids ([] :: [k]) Source # 
Instance details

Defined in Control.Eff.Concurrent.Api.Server

Associated Types

type ServerPids [] :: Type Source #

Methods

toServerPids :: proxy [] -> ProcessId -> ServerPids [] Source #

(ToServerPids api1, ToServerPids api2) => ToServerPids (api1 ': api2 :: [Type]) Source # 
Instance details

Defined in Control.Eff.Concurrent.Api.Server

Associated Types

type ServerPids (api1 ': api2) :: Type Source #

Methods

toServerPids :: proxy (api1 ': api2) -> ProcessId -> ServerPids (api1 ': api2) Source #

Interrupt handler

data InterruptCallback eff where Source #

Just a wrapper around a function that will be applied to the result of a MessageCallbacks StopServer clause, or an InterruptReason caught during the execution of receive or a MessageCallback

Since: 0.13.2

Instances
Default (InterruptCallback eff) Source # 
Instance details

Defined in Control.Eff.Concurrent.Api.Server

Methods

def :: InterruptCallback eff #

stopServerOnInterrupt :: forall eff. HasCallStack => InterruptCallback eff Source #

A smart constructor for InterruptCallbacks

Since: 0.13.2