Safe Haskell | None |
---|---|
Language | Haskell2010 |
Support code to implement Api
_server_ processes.
Since: 0.16.0
Synopsis
- spawnApiServer :: forall api eff. (ToServerPids api, HasCallStack) => MessageCallback api (InterruptableProcess eff) -> InterruptCallback (ConsProcess eff) -> Eff (InterruptableProcess eff) (ServerPids api)
- spawnLinkApiServer :: forall api eff. (ToServerPids api, HasCallStack) => MessageCallback api (InterruptableProcess eff) -> InterruptCallback (ConsProcess eff) -> Eff (InterruptableProcess eff) (ServerPids api)
- 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)
- 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)
- 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)
- apiServerLoop :: forall api eff serverEff. (HasCallStack, ToServerPids api, Member Interrupts serverEff, SetMember Process (Process eff) serverEff) => MessageCallback api serverEff -> InterruptCallback serverEff -> Eff serverEff ()
- data CallbackResult where
- data MessageCallback api eff where
- MessageCallback :: MessageSelector a -> (a -> Eff eff CallbackResult) -> MessageCallback api eff
- handleCasts :: forall api eff. (HasCallStack, Typeable api, Typeable (Api api Asynchronous)) => (Api api Asynchronous -> Eff eff CallbackResult) -> MessageCallback api eff
- 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
- 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
- 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
- handleMessages :: forall eff a. (HasCallStack, NFData a, Typeable a) => (a -> Eff eff CallbackResult) -> MessageCallback '[] eff
- handleSelectedMessages :: forall eff a. HasCallStack => MessageSelector a -> (a -> Eff eff CallbackResult) -> MessageCallback '[] eff
- handleAnyMessages :: forall eff. HasCallStack => (Dynamic -> Eff eff CallbackResult) -> MessageCallback '[] eff
- handleProcessDowns :: forall eff. HasCallStack => (MonitorReference -> Eff eff CallbackResult) -> MessageCallback '[] eff
- dropUnhandledMessages :: forall eff. HasCallStack => MessageCallback '[] eff
- exitOnUnhandled :: forall eff. HasCallStack => MessageCallback '[] eff
- logUnhandledMessages :: forall eff. (Member Logs eff, HasCallStack) => MessageCallback '[] eff
- (^:) :: forall (api1 :: Type) (apis2 :: [Type]) eff. HasCallStack => MessageCallback api1 eff -> MessageCallback apis2 eff -> MessageCallback (api1 ': apis2) eff
- fallbackHandler :: forall api eff. HasCallStack => MessageCallback api eff -> MessageCallback '[] eff
- class ToServerPids (t :: k) where
- type ServerPids t
- toServerPids :: proxy t -> ProcessId -> ServerPids t
- data InterruptCallback eff where
- InterruptCallback :: (InterruptReason -> Eff eff CallbackResult) -> InterruptCallback eff
- stopServerOnInterrupt :: forall eff. HasCallStack => InterruptCallback eff
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
call
s. 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
AwaitNext :: CallbackResult | Tell the server to keep the server loop running |
StopServer :: InterruptReason -> CallbackResult | Tell the server to exit, this will cause |
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
MessageCallback :: MessageSelector a -> (a -> Eff eff CallbackResult) -> MessageCallback api eff |
Instances
Semigroup (MessageCallback api eff) Source # | |
Defined in Control.Eff.Concurrent.Api.Server (<>) :: 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 # | |
Defined in Control.Eff.Concurrent.Api.Server 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 # | |
Defined in Control.Eff.Concurrent.Api.Server def :: MessageCallback api eff # |
Callback Smart Constructors
Calls and Casts (for Api
s)
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 MessageCallback
s
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 MessageCallback
s
Example
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 MessageCallback
s
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 MessageCallback
s
Since: 0.13.2
handleSelectedMessages :: forall eff a. HasCallStack => MessageSelector a -> (a -> Eff eff CallbackResult) -> MessageCallback '[] eff Source #
A smart constructor for MessageCallback
s
Since: 0.13.2
handleAnyMessages :: forall eff. HasCallStack => (Dynamic -> Eff eff CallbackResult) -> MessageCallback '[] eff Source #
A smart constructor for MessageCallback
s
Since: 0.13.2
handleProcessDowns :: forall eff. HasCallStack => (MonitorReference -> Eff eff CallbackResult) -> MessageCallback '[] eff Source #
A smart constructor for MessageCallback
s
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 Api
s 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
type ServerPids t Source #
toServerPids :: proxy t -> ProcessId -> ServerPids t Source #
Instances
ToServerPids api1 => ToServerPids (api1 :: Type) Source # | |
Defined in Control.Eff.Concurrent.Api.Server type ServerPids api1 :: Type Source # toServerPids :: proxy api1 -> ProcessId -> ServerPids api1 Source # | |
ToServerPids ([] :: [k]) Source # | |
Defined in Control.Eff.Concurrent.Api.Server type ServerPids [] :: Type Source # toServerPids :: proxy [] -> ProcessId -> ServerPids [] Source # | |
(ToServerPids api1, ToServerPids api2) => ToServerPids (api1 ': api2 :: [Type]) Source # | |
Defined in Control.Eff.Concurrent.Api.Server type ServerPids (api1 ': api2) :: Type Source # 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 MessageCallback
s StopServer
clause, or an InterruptReason
caught during
the execution of receive
or a MessageCallback
Since: 0.13.2
InterruptCallback :: (InterruptReason -> Eff eff CallbackResult) -> InterruptCallback eff |
Instances
Default (InterruptCallback eff) Source # | |
Defined in Control.Eff.Concurrent.Api.Server def :: InterruptCallback eff # |
stopServerOnInterrupt :: forall eff. HasCallStack => InterruptCallback eff Source #
A smart constructor for InterruptCallback
s
Since: 0.13.2