{-# LANGUAGE ExistentialQuantification #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE PatternGuards #-}
module Control.Distributed.Process.ManagedProcess.Server
(
condition
, state
, input
, reply
, replyWith
, noReply
, continue
, timeoutAfter
, hibernate
, stop
, stopWith
, replyTo
, replyChan
, reject
, rejectWith
, become
, noReply_
, haltNoReply_
, continue_
, timeoutAfter_
, hibernate_
, stop_
, handleCall
, handleCallIf
, handleCallFrom
, handleCallFromIf
, handleRpcChan
, handleRpcChanIf
, handleCast
, handleCastIf
, handleInfo
, handleRaw
, handleDispatch
, handleDispatchIf
, handleExit
, handleExitIf
, action
, handleCall_
, handleCallIf_
, handleCallFrom_
, handleCallFromIf_
, handleRpcChan_
, handleRpcChanIf_
, handleCast_
, handleCastIf_
, handleControlChan
, handleControlChan_
, handleExternal
, handleExternal_
, handleCallExternal
) where
import Control.Concurrent.STM (STM, atomically)
import Control.Distributed.Process hiding (call, Message)
import qualified Control.Distributed.Process as P (Message)
import Control.Distributed.Process.Serializable
import Control.Distributed.Process.ManagedProcess.Internal.Types hiding (liftIO, lift)
import Control.Distributed.Process.Extras
( ExitReason(..)
, Routable(..)
)
import Control.Distributed.Process.Extras.Time
import Prelude hiding (init)
condition :: forall a b. (Serializable a, Serializable b)
=> (a -> b -> Bool)
-> Condition a b
condition :: forall a b.
(Serializable a, Serializable b) =>
(a -> b -> Bool) -> Condition a b
condition = (a -> b -> Bool) -> Condition a b
forall s m. (s -> m -> Bool) -> Condition s m
Condition
state :: forall s m. (Serializable m) => (s -> Bool) -> Condition s m
state :: forall s m. Serializable m => (s -> Bool) -> Condition s m
state = (s -> Bool) -> Condition s m
forall s m. (s -> Bool) -> Condition s m
State
input :: forall s m. (Serializable m) => (m -> Bool) -> Condition s m
input :: forall s m. Serializable m => (m -> Bool) -> Condition s m
input = (m -> Bool) -> Condition s m
forall s m. (m -> Bool) -> Condition s m
Input
reject :: forall r s . s -> String -> Reply r s
reject :: forall r s. s -> String -> Reply r s
reject s
st String
rs = s -> Action s
forall s. s -> Action s
continue s
st Action s
-> (ProcessAction s -> Process (ProcessReply r s))
-> Process (ProcessReply r s)
forall a b. Process a -> (a -> Process b) -> Process b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ProcessReply r s -> Process (ProcessReply r s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (ProcessReply r s -> Process (ProcessReply r s))
-> (ProcessAction s -> ProcessReply r s)
-> ProcessAction s
-> Process (ProcessReply r s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ProcessAction s -> ProcessReply r s
forall r s. String -> ProcessAction s -> ProcessReply r s
ProcessReject String
rs
rejectWith :: forall r m s . (Show r) => s -> r -> Reply m s
rejectWith :: forall r m s. Show r => s -> r -> Reply m s
rejectWith s
st r
rs = s -> String -> Reply m s
forall r s. s -> String -> Reply r s
reject s
st (r -> String
forall a. Show a => a -> String
show r
rs)
reply :: (Serializable r) => r -> s -> Reply r s
reply :: forall r s. Serializable r => r -> s -> Reply r s
reply r
r s
s = s -> Action s
forall s. s -> Action s
continue s
s Action s
-> (ProcessAction s -> Process (ProcessReply r s))
-> Process (ProcessReply r s)
forall a b. Process a -> (a -> Process b) -> Process b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= r -> ProcessAction s -> Process (ProcessReply r s)
forall r s. Serializable r => r -> ProcessAction s -> Reply r s
replyWith r
r
replyWith :: (Serializable r)
=> r
-> ProcessAction s
-> Reply r s
replyWith :: forall r s. Serializable r => r -> ProcessAction s -> Reply r s
replyWith r
r ProcessAction s
s = ProcessReply r s -> Process (ProcessReply r s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (ProcessReply r s -> Process (ProcessReply r s))
-> ProcessReply r s -> Process (ProcessReply r s)
forall a b. (a -> b) -> a -> b
$ r -> ProcessAction s -> ProcessReply r s
forall r s. r -> ProcessAction s -> ProcessReply r s
ProcessReply r
r ProcessAction s
s
noReply :: (Serializable r) => ProcessAction s -> Reply r s
noReply :: forall r s. Serializable r => ProcessAction s -> Reply r s
noReply = ProcessReply r s -> Process (ProcessReply r s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (ProcessReply r s -> Process (ProcessReply r s))
-> (ProcessAction s -> ProcessReply r s)
-> ProcessAction s
-> Process (ProcessReply r s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ProcessAction s -> ProcessReply r s
forall r s. ProcessAction s -> ProcessReply r s
NoReply
noReply_ :: forall s r . (Serializable r) => s -> Reply r s
noReply_ :: forall s r. Serializable r => s -> Reply r s
noReply_ s
s = s -> Action s
forall s. s -> Action s
continue s
s Action s
-> (ProcessAction s -> Process (ProcessReply r s))
-> Process (ProcessReply r s)
forall a b. Process a -> (a -> Process b) -> Process b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ProcessAction s -> Process (ProcessReply r s)
forall r s. Serializable r => ProcessAction s -> Reply r s
noReply
haltNoReply_ :: Serializable r => ExitReason -> Reply r s
haltNoReply_ :: forall r s. Serializable r => ExitReason -> Reply r s
haltNoReply_ ExitReason
r = ExitReason -> Action s
forall s. ExitReason -> Action s
stop ExitReason
r Action s
-> (ProcessAction s -> Process (ProcessReply r s))
-> Process (ProcessReply r s)
forall a b. Process a -> (a -> Process b) -> Process b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= ProcessAction s -> Process (ProcessReply r s)
forall r s. Serializable r => ProcessAction s -> Reply r s
noReply
continue :: s -> Action s
continue :: forall s. s -> Action s
continue = ProcessAction s -> Process (ProcessAction s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (ProcessAction s -> Process (ProcessAction s))
-> (s -> ProcessAction s) -> s -> Process (ProcessAction s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> ProcessAction s
forall s. s -> ProcessAction s
ProcessContinue
continue_ :: (s -> Action s)
continue_ :: forall s. s -> Action s
continue_ = ProcessAction s -> Process (ProcessAction s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (ProcessAction s -> Process (ProcessAction s))
-> (s -> ProcessAction s) -> s -> Process (ProcessAction s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. s -> ProcessAction s
forall s. s -> ProcessAction s
ProcessContinue
timeoutAfter :: Delay -> s -> Action s
timeoutAfter :: forall s. Delay -> s -> Action s
timeoutAfter Delay
d s
s = ProcessAction s -> Process (ProcessAction s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (ProcessAction s -> Process (ProcessAction s))
-> ProcessAction s -> Process (ProcessAction s)
forall a b. (a -> b) -> a -> b
$ Delay -> s -> ProcessAction s
forall s. Delay -> s -> ProcessAction s
ProcessTimeout Delay
d s
s
timeoutAfter_ :: StatelessHandler s Delay
timeoutAfter_ :: forall s. Delay -> s -> Action s
timeoutAfter_ Delay
d = ProcessAction s -> Process (ProcessAction s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (ProcessAction s -> Process (ProcessAction s))
-> (s -> ProcessAction s) -> s -> Process (ProcessAction s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Delay -> s -> ProcessAction s
forall s. Delay -> s -> ProcessAction s
ProcessTimeout Delay
d
hibernate :: TimeInterval -> s -> Process (ProcessAction s)
hibernate :: forall s. TimeInterval -> s -> Process (ProcessAction s)
hibernate TimeInterval
d s
s = ProcessAction s -> Process (ProcessAction s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (ProcessAction s -> Process (ProcessAction s))
-> ProcessAction s -> Process (ProcessAction s)
forall a b. (a -> b) -> a -> b
$ TimeInterval -> s -> ProcessAction s
forall s. TimeInterval -> s -> ProcessAction s
ProcessHibernate TimeInterval
d s
s
hibernate_ :: StatelessHandler s TimeInterval
hibernate_ :: forall s. TimeInterval -> s -> Process (ProcessAction s)
hibernate_ TimeInterval
d = ProcessAction s -> Process (ProcessAction s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (ProcessAction s -> Process (ProcessAction s))
-> (s -> ProcessAction s) -> s -> Process (ProcessAction s)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TimeInterval -> s -> ProcessAction s
forall s. TimeInterval -> s -> ProcessAction s
ProcessHibernate TimeInterval
d
become :: forall s . ProcessDefinition s -> s -> Action s
become :: forall s. ProcessDefinition s -> s -> Action s
become ProcessDefinition s
def s
st = ProcessAction s -> Process (ProcessAction s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (ProcessAction s -> Process (ProcessAction s))
-> ProcessAction s -> Process (ProcessAction s)
forall a b. (a -> b) -> a -> b
$ ProcessDefinition s -> s -> ProcessAction s
forall s. ProcessDefinition s -> s -> ProcessAction s
ProcessBecome ProcessDefinition s
def s
st
stop :: ExitReason -> Action s
stop :: forall s. ExitReason -> Action s
stop ExitReason
r = ProcessAction s -> Process (ProcessAction s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (ProcessAction s -> Process (ProcessAction s))
-> ProcessAction s -> Process (ProcessAction s)
forall a b. (a -> b) -> a -> b
$ ExitReason -> ProcessAction s
forall s. ExitReason -> ProcessAction s
ProcessStop ExitReason
r
stopWith :: s -> ExitReason -> Action s
stopWith :: forall s. s -> ExitReason -> Action s
stopWith s
s ExitReason
r = ProcessAction s -> Process (ProcessAction s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (ProcessAction s -> Process (ProcessAction s))
-> ProcessAction s -> Process (ProcessAction s)
forall a b. (a -> b) -> a -> b
$ s -> ExitReason -> ProcessAction s
forall s. s -> ExitReason -> ProcessAction s
ProcessStopping s
s ExitReason
r
stop_ :: StatelessHandler s ExitReason
stop_ :: forall s. StatelessHandler s ExitReason
stop_ ExitReason
r s
_ = ExitReason -> Action s
forall s. ExitReason -> Action s
stop ExitReason
r
replyTo :: (Serializable m) => CallRef m -> m -> Process ()
replyTo :: forall m. Serializable m => CallRef m -> m -> Process ()
replyTo cRef :: CallRef m
cRef@(CallRef (Recipient
_, CallId
tag)) m
msg = CallRef m -> CallResponse m -> Process ()
forall m.
(Serializable m, Resolvable (CallRef m)) =>
CallRef m -> m -> Process ()
forall a m.
(Routable a, Serializable m, Resolvable a) =>
a -> m -> Process ()
sendTo CallRef m
cRef (CallResponse m -> Process ()) -> CallResponse m -> Process ()
forall a b. (a -> b) -> a -> b
$ m -> CallId -> CallResponse m
forall a. a -> CallId -> CallResponse a
CallResponse m
msg CallId
tag
replyChan :: (Serializable m) => SendPort m -> m -> Process ()
replyChan :: forall m. Serializable m => SendPort m -> m -> Process ()
replyChan = SendPort m -> m -> Process ()
forall m. Serializable m => SendPort m -> m -> Process ()
sendChan
handleCall_ :: (Serializable a, Serializable b)
=> (a -> Process b)
-> Dispatcher s
handleCall_ :: forall a b s.
(Serializable a, Serializable b) =>
(a -> Process b) -> Dispatcher s
handleCall_ = Condition s a -> (a -> Process b) -> Dispatcher s
forall s a b.
(Serializable a, Serializable b) =>
Condition s a -> (a -> Process b) -> Dispatcher s
handleCallIf_ (Condition s a -> (a -> Process b) -> Dispatcher s)
-> Condition s a -> (a -> Process b) -> Dispatcher s
forall a b. (a -> b) -> a -> b
$ (a -> Bool) -> Condition s a
forall s m. Serializable m => (m -> Bool) -> Condition s m
input (Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True)
handleCallIf_ :: forall s a b . (Serializable a, Serializable b)
=> Condition s a
-> (a -> Process b)
-> Dispatcher s
handleCallIf_ :: forall s a b.
(Serializable a, Serializable b) =>
Condition s a -> (a -> Process b) -> Dispatcher s
handleCallIf_ Condition s a
cond a -> Process b
handler
= DispatchIf {
dispatch :: s -> Message a b -> Process (ProcessAction s)
dispatch = \s
s (CallMessage a
p CallRef b
c) -> a -> Process b
handler a
p Process b
-> (b -> Process (ProcessAction s)) -> Process (ProcessAction s)
forall a b. Process a -> (a -> Process b) -> Process b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Serializable b => CallRef b -> s -> b -> Process (ProcessAction s)
CallRef b -> s -> b -> Process (ProcessAction s)
mkCallReply CallRef b
c s
s
, dispatchIf :: s -> Message a b -> Bool
dispatchIf = Condition s a -> s -> Message a b -> Bool
forall s m a.
Serializable m =>
Condition s m -> s -> Message m a -> Bool
checkCall Condition s a
cond
}
where
mkCallReply :: (Serializable b)
=> CallRef b
-> s
-> b
-> Process (ProcessAction s)
mkCallReply :: Serializable b => CallRef b -> s -> b -> Process (ProcessAction s)
mkCallReply CallRef b
c s
s b
m =
let (Recipient
c', CallId
t) = CallRef b -> (Recipient, CallId)
forall a. CallRef a -> (Recipient, CallId)
unCaller CallRef b
c
in Recipient -> CallResponse b -> Process ()
forall m.
(Serializable m, Resolvable Recipient) =>
Recipient -> m -> Process ()
forall a m.
(Routable a, Serializable m, Resolvable a) =>
a -> m -> Process ()
sendTo Recipient
c' (b -> CallId -> CallResponse b
forall a. a -> CallId -> CallResponse a
CallResponse b
m CallId
t) Process ()
-> Process (ProcessAction s) -> Process (ProcessAction s)
forall a b. Process a -> Process b -> Process b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> s -> Process (ProcessAction s)
forall s. s -> Action s
continue s
s
handleCall :: (Serializable a, Serializable b)
=> CallHandler s a b
-> Dispatcher s
handleCall :: forall a b s.
(Serializable a, Serializable b) =>
CallHandler s a b -> Dispatcher s
handleCall = Condition s a -> CallHandler s a b -> Dispatcher s
forall s a b.
(Serializable a, Serializable b) =>
Condition s a -> CallHandler s a b -> Dispatcher s
handleCallIf (Condition s a -> CallHandler s a b -> Dispatcher s)
-> Condition s a -> CallHandler s a b -> Dispatcher s
forall a b. (a -> b) -> a -> b
$ (s -> Bool) -> Condition s a
forall s m. Serializable m => (s -> Bool) -> Condition s m
state (Bool -> s -> Bool
forall a b. a -> b -> a
const Bool
True)
handleCallIf :: forall s a b . (Serializable a, Serializable b)
=> Condition s a
-> CallHandler s a b
-> Dispatcher s
handleCallIf :: forall s a b.
(Serializable a, Serializable b) =>
Condition s a -> CallHandler s a b -> Dispatcher s
handleCallIf Condition s a
cond CallHandler s a b
handler
= DispatchIf
{ dispatch :: s -> Message a b -> Process (ProcessAction s)
dispatch = \s
s (CallMessage a
p CallRef b
c) -> CallHandler s a b
handler s
s a
p Process (ProcessReply b s)
-> (ProcessReply b s -> Process (ProcessAction s))
-> Process (ProcessAction s)
forall a b. Process a -> (a -> Process b) -> Process b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CallRef b -> ProcessReply b s -> Process (ProcessAction s)
forall b s.
Serializable b =>
CallRef b -> ProcessReply b s -> Process (ProcessAction s)
mkReply CallRef b
c
, dispatchIf :: s -> Message a b -> Bool
dispatchIf = Condition s a -> s -> Message a b -> Bool
forall s m a.
Serializable m =>
Condition s m -> s -> Message m a -> Bool
checkCall Condition s a
cond
}
handleCallFrom_ :: forall s a b . (Serializable a, Serializable b)
=> StatelessCallHandler s a b
-> Dispatcher s
handleCallFrom_ :: forall s a b.
(Serializable a, Serializable b) =>
StatelessCallHandler s a b -> Dispatcher s
handleCallFrom_ = Condition s a -> StatelessCallHandler s a b -> Dispatcher s
forall s a b.
(Serializable a, Serializable b) =>
Condition s a -> StatelessCallHandler s a b -> Dispatcher s
handleCallFromIf_ (Condition s a -> StatelessCallHandler s a b -> Dispatcher s)
-> Condition s a -> StatelessCallHandler s a b -> Dispatcher s
forall a b. (a -> b) -> a -> b
$ (a -> Bool) -> Condition s a
forall s m. Serializable m => (m -> Bool) -> Condition s m
input (Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True)
handleCallFromIf_ :: forall s a b . (Serializable a, Serializable b)
=> Condition s a
-> StatelessCallHandler s a b
-> Dispatcher s
handleCallFromIf_ :: forall s a b.
(Serializable a, Serializable b) =>
Condition s a -> StatelessCallHandler s a b -> Dispatcher s
handleCallFromIf_ Condition s a
cond StatelessCallHandler s a b
handler =
DispatchIf {
dispatch :: s -> Message a b -> Process (ProcessAction s)
dispatch = \s
_ (CallMessage a
p CallRef b
c) -> StatelessCallHandler s a b
handler CallRef b
c a
p Process (ProcessReply b s)
-> (ProcessReply b s -> Process (ProcessAction s))
-> Process (ProcessAction s)
forall a b. Process a -> (a -> Process b) -> Process b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CallRef b -> ProcessReply b s -> Process (ProcessAction s)
forall b s.
Serializable b =>
CallRef b -> ProcessReply b s -> Process (ProcessAction s)
mkReply CallRef b
c
, dispatchIf :: s -> Message a b -> Bool
dispatchIf = Condition s a -> s -> Message a b -> Bool
forall s m a.
Serializable m =>
Condition s m -> s -> Message m a -> Bool
checkCall Condition s a
cond
}
handleCallFrom :: forall s a b . (Serializable a, Serializable b)
=> DeferredCallHandler s a b
-> Dispatcher s
handleCallFrom :: forall s a b.
(Serializable a, Serializable b) =>
DeferredCallHandler s a b -> Dispatcher s
handleCallFrom = Condition s a -> DeferredCallHandler s a b -> Dispatcher s
forall s a b.
(Serializable a, Serializable b) =>
Condition s a -> DeferredCallHandler s a b -> Dispatcher s
handleCallFromIf (Condition s a -> DeferredCallHandler s a b -> Dispatcher s)
-> Condition s a -> DeferredCallHandler s a b -> Dispatcher s
forall a b. (a -> b) -> a -> b
$ (s -> Bool) -> Condition s a
forall s m. Serializable m => (s -> Bool) -> Condition s m
state (Bool -> s -> Bool
forall a b. a -> b -> a
const Bool
True)
handleCallFromIf :: forall s a b . (Serializable a, Serializable b)
=> Condition s a
-> DeferredCallHandler s a b
-> Dispatcher s
handleCallFromIf :: forall s a b.
(Serializable a, Serializable b) =>
Condition s a -> DeferredCallHandler s a b -> Dispatcher s
handleCallFromIf Condition s a
cond DeferredCallHandler s a b
handler
= DispatchIf {
dispatch :: s -> Message a b -> Process (ProcessAction s)
dispatch = \s
s (CallMessage a
p CallRef b
c) -> DeferredCallHandler s a b
handler CallRef b
c s
s a
p Process (ProcessReply b s)
-> (ProcessReply b s -> Process (ProcessAction s))
-> Process (ProcessAction s)
forall a b. Process a -> (a -> Process b) -> Process b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= CallRef b -> ProcessReply b s -> Process (ProcessAction s)
forall b s.
Serializable b =>
CallRef b -> ProcessReply b s -> Process (ProcessAction s)
mkReply CallRef b
c
, dispatchIf :: s -> Message a b -> Bool
dispatchIf = Condition s a -> s -> Message a b -> Bool
forall s m a.
Serializable m =>
Condition s m -> s -> Message m a -> Bool
checkCall Condition s a
cond
}
handleRpcChan :: forall s a b . (Serializable a, Serializable b)
=> ChannelHandler s a b
-> Dispatcher s
handleRpcChan :: forall s a b.
(Serializable a, Serializable b) =>
ChannelHandler s a b -> Dispatcher s
handleRpcChan = Condition s a -> ChannelHandler s a b -> Dispatcher s
forall s a b.
(Serializable a, Serializable b) =>
Condition s a -> ChannelHandler s a b -> Dispatcher s
handleRpcChanIf (Condition s a -> ChannelHandler s a b -> Dispatcher s)
-> Condition s a -> ChannelHandler s a b -> Dispatcher s
forall a b. (a -> b) -> a -> b
$ (a -> Bool) -> Condition s a
forall s m. Serializable m => (m -> Bool) -> Condition s m
input (Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True)
handleRpcChanIf :: forall s a b . (Serializable a, Serializable b)
=> Condition s a
-> ChannelHandler s a b
-> Dispatcher s
handleRpcChanIf :: forall s a b.
(Serializable a, Serializable b) =>
Condition s a -> ChannelHandler s a b -> Dispatcher s
handleRpcChanIf Condition s a
cond ChannelHandler s a b
handler
= DispatchIf {
dispatch :: s -> Message a b -> Process (ProcessAction s)
dispatch = \s
s (ChanMessage a
p SendPort b
c) -> ChannelHandler s a b
handler SendPort b
c s
s a
p
, dispatchIf :: s -> Message a b -> Bool
dispatchIf = Condition s a -> s -> Message a b -> Bool
forall s m a.
Serializable m =>
Condition s m -> s -> Message m a -> Bool
checkRpc Condition s a
cond
}
handleRpcChan_ :: forall s a b . (Serializable a, Serializable b)
=> StatelessChannelHandler s a b
-> Dispatcher s
handleRpcChan_ :: forall s a b.
(Serializable a, Serializable b) =>
StatelessChannelHandler s a b -> Dispatcher s
handleRpcChan_ = Condition s a -> StatelessChannelHandler s a b -> Dispatcher s
forall s a b.
(Serializable a, Serializable b) =>
Condition s a -> StatelessChannelHandler s a b -> Dispatcher s
handleRpcChanIf_ (Condition s a -> StatelessChannelHandler s a b -> Dispatcher s)
-> Condition s a -> StatelessChannelHandler s a b -> Dispatcher s
forall a b. (a -> b) -> a -> b
$ (a -> Bool) -> Condition s a
forall s m. Serializable m => (m -> Bool) -> Condition s m
input (Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True)
handleRpcChanIf_ :: forall s a b . (Serializable a, Serializable b)
=> Condition s a
-> StatelessChannelHandler s a b
-> Dispatcher s
handleRpcChanIf_ :: forall s a b.
(Serializable a, Serializable b) =>
Condition s a -> StatelessChannelHandler s a b -> Dispatcher s
handleRpcChanIf_ Condition s a
c StatelessChannelHandler s a b
h
= DispatchIf { dispatch :: s -> Message a b -> Process (ProcessAction s)
dispatch = \s
s ((ChanMessage a
m SendPort b
p) :: Message a b) -> StatelessChannelHandler s a b
h SendPort b
p a
m s
s
, dispatchIf :: s -> Message a b -> Bool
dispatchIf = Condition s a -> s -> Message a b -> Bool
forall s m a.
Serializable m =>
Condition s m -> s -> Message m a -> Bool
checkRpc Condition s a
c
}
handleCast :: (Serializable a)
=> CastHandler s a
-> Dispatcher s
handleCast :: forall a s. Serializable a => CastHandler s a -> Dispatcher s
handleCast = Condition s a -> CastHandler s a -> Dispatcher s
forall s a.
Serializable a =>
Condition s a -> CastHandler s a -> Dispatcher s
handleCastIf (Condition s a -> CastHandler s a -> Dispatcher s)
-> Condition s a -> CastHandler s a -> Dispatcher s
forall a b. (a -> b) -> a -> b
$ (a -> Bool) -> Condition s a
forall s m. Serializable m => (m -> Bool) -> Condition s m
input (Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True)
handleCastIf :: forall s a . (Serializable a)
=> Condition s a
-> CastHandler s a
-> Dispatcher s
handleCastIf :: forall s a.
Serializable a =>
Condition s a -> CastHandler s a -> Dispatcher s
handleCastIf Condition s a
cond CastHandler s a
h
= DispatchIf {
dispatch :: s -> Message a () -> Process (ProcessAction s)
dispatch = \s
s ((CastMessage a
p) :: Message a ()) -> CastHandler s a
h s
s a
p
, dispatchIf :: s -> Message a () -> Bool
dispatchIf = Condition s a -> s -> Message a () -> Bool
forall s m.
Serializable m =>
Condition s m -> s -> Message m () -> Bool
checkCast Condition s a
cond
}
handleExternal :: forall s a . (Serializable a)
=> STM a
-> ActionHandler s a
-> ExternDispatcher s
handleExternal :: forall s a.
Serializable a =>
STM a -> ActionHandler s a -> ExternDispatcher s
handleExternal STM a
a ActionHandler s a
h =
let matchMsg' :: Match Message
matchMsg' = STM a -> (a -> Process Message) -> Match Message
forall a b. STM a -> (a -> Process b) -> Match b
matchSTM STM a
a (\(a
m :: r) -> Message -> Process Message
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (Message -> Process Message) -> Message -> Process Message
forall a b. (a -> b) -> a -> b
$ a -> Message
forall a. Serializable a => a -> Message
unsafeWrapMessage a
m)
matchAny' :: (Message -> b) -> Match b
matchAny' Message -> b
f = STM a -> (a -> Process b) -> Match b
forall a b. STM a -> (a -> Process b) -> Match b
matchSTM STM a
a (\(a
m :: r) -> b -> Process b
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> Process b) -> b -> Process b
forall a b. (a -> b) -> a -> b
$ Message -> b
f (a -> Message
forall a. Serializable a => a -> Message
unsafeWrapMessage a
m)) in
DispatchSTM
{ stmAction :: STM a
stmAction = STM a
a
, dispatchStm :: ActionHandler s a
dispatchStm = ActionHandler s a
h
, matchStm :: Match Message
matchStm = Match Message
matchMsg'
, matchAnyStm :: forall m. (Message -> m) -> Match m
matchAnyStm = (Message -> m) -> Match m
forall m. (Message -> m) -> Match m
matchAny'
}
handleExternal_ :: forall s a . (Serializable a)
=> STM a
-> StatelessHandler s a
-> ExternDispatcher s
handleExternal_ :: forall s a.
Serializable a =>
STM a -> StatelessHandler s a -> ExternDispatcher s
handleExternal_ STM a
a StatelessHandler s a
h = STM a -> ActionHandler s a -> ExternDispatcher s
forall s a.
Serializable a =>
STM a -> ActionHandler s a -> ExternDispatcher s
handleExternal STM a
a (StatelessHandler s a -> ActionHandler s a
forall a b c. (a -> b -> c) -> b -> a -> c
flip StatelessHandler s a
h)
handleCallExternal :: forall s r w . (Serializable r)
=> STM r
-> (w -> STM ())
-> CallHandler s r w
-> ExternDispatcher s
handleCallExternal :: forall s r w.
Serializable r =>
STM r -> (w -> STM ()) -> CallHandler s r w -> ExternDispatcher s
handleCallExternal STM r
reader w -> STM ()
writer CallHandler s r w
handler =
let matchMsg' :: Match Message
matchMsg' = STM r -> (r -> Process Message) -> Match Message
forall a b. STM a -> (a -> Process b) -> Match b
matchSTM STM r
reader (\(r
m :: r) -> Message -> Process Message
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (Message -> Process Message) -> Message -> Process Message
forall a b. (a -> b) -> a -> b
$ r -> Message
forall a. Serializable a => a -> Message
unsafeWrapMessage r
m)
matchAny' :: (Message -> b) -> Match b
matchAny' Message -> b
f = STM r -> (r -> Process b) -> Match b
forall a b. STM a -> (a -> Process b) -> Match b
matchSTM STM r
reader (\(r
m :: r) -> b -> Process b
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return (b -> Process b) -> b -> Process b
forall a b. (a -> b) -> a -> b
$ Message -> b
f (Message -> b) -> Message -> b
forall a b. (a -> b) -> a -> b
$ r -> Message
forall a. Serializable a => a -> Message
unsafeWrapMessage r
m) in
DispatchSTM
{ stmAction :: STM r
stmAction = STM r
reader
, dispatchStm :: s -> r -> Process (ProcessAction s)
dispatchStm = CallHandler s r w -> s -> r -> Process (ProcessAction s)
forall {m :: * -> *} {t} {t} {s}.
MonadIO m =>
(t -> t -> m (ProcessReply w s)) -> t -> t -> m (ProcessAction s)
doStmReply CallHandler s r w
handler
, matchStm :: Match Message
matchStm = Match Message
matchMsg'
, matchAnyStm :: forall m. (Message -> m) -> Match m
matchAnyStm = (Message -> m) -> Match m
forall m. (Message -> m) -> Match m
matchAny'
}
where
doStmReply :: (t -> t -> m (ProcessReply w s)) -> t -> t -> m (ProcessAction s)
doStmReply t -> t -> m (ProcessReply w s)
d t
s t
m = t -> t -> m (ProcessReply w s)
d t
s t
m m (ProcessReply w s)
-> (ProcessReply w s -> m (ProcessAction s)) -> m (ProcessAction s)
forall a b. m a -> (a -> m b) -> m b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= (w -> STM ()) -> ProcessReply w s -> m (ProcessAction s)
forall {m :: * -> *} {t} {a} {s}.
MonadIO m =>
(t -> STM a) -> ProcessReply t s -> m (ProcessAction s)
doXfmReply w -> STM ()
writer
doXfmReply :: (t -> STM a) -> ProcessReply t s -> m (ProcessAction s)
doXfmReply t -> STM a
_ (NoReply ProcessAction s
a) = ProcessAction s -> m (ProcessAction s)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ProcessAction s
a
doXfmReply t -> STM a
_ (ProcessReject String
_ ProcessAction s
a) = ProcessAction s -> m (ProcessAction s)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ProcessAction s
a
doXfmReply t -> STM a
w (ProcessReply t
r' ProcessAction s
a) = IO a -> m a
forall a. IO a -> m a
forall (m :: * -> *) a. MonadIO m => IO a -> m a
liftIO (STM a -> IO a
forall a. STM a -> IO a
atomically (STM a -> IO a) -> STM a -> IO a
forall a b. (a -> b) -> a -> b
$ t -> STM a
w t
r') m a -> m (ProcessAction s) -> m (ProcessAction s)
forall a b. m a -> m b -> m b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ProcessAction s -> m (ProcessAction s)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return ProcessAction s
a
handleControlChan :: forall s a . (Serializable a)
=> ControlChannel a
-> ActionHandler s a
-> ExternDispatcher s
handleControlChan :: forall s a.
Serializable a =>
ControlChannel a -> ActionHandler s a -> ExternDispatcher s
handleControlChan ControlChannel a
chan ActionHandler s a
h
= DispatchCC { channel :: ReceivePort (Message a ())
channel = (SendPort (Message a ()), ReceivePort (Message a ()))
-> ReceivePort (Message a ())
forall a b. (a, b) -> b
snd ((SendPort (Message a ()), ReceivePort (Message a ()))
-> ReceivePort (Message a ()))
-> (SendPort (Message a ()), ReceivePort (Message a ()))
-> ReceivePort (Message a ())
forall a b. (a -> b) -> a -> b
$ ControlChannel a
-> (SendPort (Message a ()), ReceivePort (Message a ()))
forall m.
ControlChannel m
-> (SendPort (Message m ()), ReceivePort (Message m ()))
unControl ControlChannel a
chan
, dispatchChan :: s -> Message a () -> Process (ProcessAction s)
dispatchChan = \s
s ((CastMessage a
p) :: Message a ()) -> ActionHandler s a
h s
s a
p
}
handleControlChan_ :: forall s a. (Serializable a)
=> ControlChannel a
-> StatelessHandler s a
-> ExternDispatcher s
handleControlChan_ :: forall s a.
Serializable a =>
ControlChannel a -> StatelessHandler s a -> ExternDispatcher s
handleControlChan_ ControlChannel a
chan StatelessHandler s a
h
= DispatchCC { channel :: ReceivePort (Message a ())
channel = (SendPort (Message a ()), ReceivePort (Message a ()))
-> ReceivePort (Message a ())
forall a b. (a, b) -> b
snd ((SendPort (Message a ()), ReceivePort (Message a ()))
-> ReceivePort (Message a ()))
-> (SendPort (Message a ()), ReceivePort (Message a ()))
-> ReceivePort (Message a ())
forall a b. (a -> b) -> a -> b
$ ControlChannel a
-> (SendPort (Message a ()), ReceivePort (Message a ()))
forall m.
ControlChannel m
-> (SendPort (Message m ()), ReceivePort (Message m ()))
unControl ControlChannel a
chan
, dispatchChan :: s -> Message a () -> Process (ProcessAction s)
dispatchChan = \s
s ((CastMessage a
p) :: Message a ()) -> StatelessHandler s a
h a
p s
s
}
handleCast_ :: (Serializable a)
=> StatelessHandler s a
-> Dispatcher s
handleCast_ :: forall a s. Serializable a => StatelessHandler s a -> Dispatcher s
handleCast_ = Condition s a -> StatelessHandler s a -> Dispatcher s
forall s a.
Serializable a =>
Condition s a -> StatelessHandler s a -> Dispatcher s
handleCastIf_ (Condition s a -> StatelessHandler s a -> Dispatcher s)
-> Condition s a -> StatelessHandler s a -> Dispatcher s
forall a b. (a -> b) -> a -> b
$ (a -> Bool) -> Condition s a
forall s m. Serializable m => (m -> Bool) -> Condition s m
input (Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True)
handleCastIf_ :: forall s a . (Serializable a)
=> Condition s a
-> StatelessHandler s a
-> Dispatcher s
handleCastIf_ :: forall s a.
Serializable a =>
Condition s a -> StatelessHandler s a -> Dispatcher s
handleCastIf_ Condition s a
cond StatelessHandler s a
h
= DispatchIf { dispatch :: s -> Message a () -> Process (ProcessAction s)
dispatch = \s
s ((CastMessage a
p) :: Message a ()) -> StatelessHandler s a
h a
p (s -> Process (ProcessAction s)) -> s -> Process (ProcessAction s)
forall a b. (a -> b) -> a -> b
$ s
s
, dispatchIf :: s -> Message a () -> Bool
dispatchIf = Condition s a -> s -> Message a () -> Bool
forall s m.
Serializable m =>
Condition s m -> s -> Message m () -> Bool
checkCast Condition s a
cond
}
action :: forall s a . (Serializable a)
=> StatelessHandler s a
-> Dispatcher s
action :: forall s a. Serializable a => StatelessHandler s a -> Dispatcher s
action StatelessHandler s a
h = ActionHandler s a -> Dispatcher s
forall s a. Serializable a => ActionHandler s a -> Dispatcher s
handleDispatch ActionHandler s a
perform
where perform :: ActionHandler s a
perform :: ActionHandler s a
perform s
s a
a = let f :: s -> Action s
f = StatelessHandler s a
h a
a in s -> Action s
f s
s
handleDispatch :: forall s a . (Serializable a)
=> ActionHandler s a
-> Dispatcher s
handleDispatch :: forall s a. Serializable a => ActionHandler s a -> Dispatcher s
handleDispatch = Condition s a -> ActionHandler s a -> Dispatcher s
forall s a.
Serializable a =>
Condition s a -> CastHandler s a -> Dispatcher s
handleDispatchIf (Condition s a -> ActionHandler s a -> Dispatcher s)
-> Condition s a -> ActionHandler s a -> Dispatcher s
forall a b. (a -> b) -> a -> b
$ (a -> Bool) -> Condition s a
forall s m. Serializable m => (m -> Bool) -> Condition s m
input (Bool -> a -> Bool
forall a b. a -> b -> a
const Bool
True)
handleDispatchIf :: forall s a . (Serializable a)
=> Condition s a
-> ActionHandler s a
-> Dispatcher s
handleDispatchIf :: forall s a.
Serializable a =>
Condition s a -> CastHandler s a -> Dispatcher s
handleDispatchIf Condition s a
cond ActionHandler s a
handler = DispatchIf {
dispatch :: s -> Message a () -> Process (ProcessAction s)
dispatch = Serializable a =>
ActionHandler s a -> s -> Message a () -> Process (ProcessAction s)
ActionHandler s a -> s -> Message a () -> Process (ProcessAction s)
doHandle ActionHandler s a
handler
, dispatchIf :: s -> Message a () -> Bool
dispatchIf = Condition s a -> s -> Message a () -> Bool
forall s m a.
Serializable m =>
Condition s m -> s -> Message m a -> Bool
check Condition s a
cond
}
where doHandle :: (Serializable a)
=> ActionHandler s a
-> s
-> Message a ()
-> Process (ProcessAction s)
doHandle :: Serializable a =>
ActionHandler s a -> s -> Message a () -> Process (ProcessAction s)
doHandle ActionHandler s a
h s
s Message a ()
msg =
case Message a ()
msg of
(CallMessage a
p CallRef ()
_) -> ActionHandler s a
h s
s a
p
(CastMessage a
p) -> ActionHandler s a
h s
s a
p
(ChanMessage a
p SendPort ()
_) -> ActionHandler s a
h s
s a
p
handleInfo :: forall s a. (Serializable a)
=> ActionHandler s a
-> DeferredDispatcher s
handleInfo :: forall s a.
Serializable a =>
ActionHandler s a -> DeferredDispatcher s
handleInfo ActionHandler s a
h = DeferredDispatcher { dispatchInfo :: s -> Message -> Process (Maybe (ProcessAction s))
dispatchInfo = ActionHandler s a
-> s -> Message -> Process (Maybe (ProcessAction s))
forall s2 a2.
Serializable a2 =>
ActionHandler s2 a2
-> s2 -> Message -> Process (Maybe (ProcessAction s2))
doHandleInfo ActionHandler s a
h }
where
doHandleInfo :: forall s2 a2. (Serializable a2)
=> ActionHandler s2 a2
-> s2
-> P.Message
-> Process (Maybe (ProcessAction s2))
doHandleInfo :: forall s2 a2.
Serializable a2 =>
ActionHandler s2 a2
-> s2 -> Message -> Process (Maybe (ProcessAction s2))
doHandleInfo ActionHandler s2 a2
h' s2
s Message
msg = Message
-> (a2 -> Process (ProcessAction s2))
-> Process (Maybe (ProcessAction s2))
forall (m :: * -> *) a b.
(Monad m, Serializable a) =>
Message -> (a -> m b) -> m (Maybe b)
handleMessage Message
msg (ActionHandler s2 a2
h' s2
s)
handleRaw :: forall s. ActionHandler s P.Message
-> DeferredDispatcher s
handleRaw :: forall s. ActionHandler s Message -> DeferredDispatcher s
handleRaw ActionHandler s Message
h = DeferredDispatcher { dispatchInfo :: s -> Message -> Process (Maybe (ProcessAction s))
dispatchInfo = ActionHandler s Message
-> s -> Message -> Process (Maybe (ProcessAction s))
forall {f :: * -> *} {t} {t} {a}.
Functor f =>
(t -> t -> f a) -> t -> t -> f (Maybe a)
doHandle ActionHandler s Message
h }
where
doHandle :: (t -> t -> f a) -> t -> t -> f (Maybe a)
doHandle t -> t -> f a
h' t
s t
msg = (a -> Maybe a) -> f a -> f (Maybe a)
forall a b. (a -> b) -> f a -> f b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap a -> Maybe a
forall a. a -> Maybe a
Just (t -> t -> f a
h' t
s t
msg)
handleExit :: forall s a. (Serializable a)
=> (ProcessId -> ActionHandler s a)
-> ExitSignalDispatcher s
handleExit :: forall s a.
Serializable a =>
(ProcessId -> ActionHandler s a) -> ExitSignalDispatcher s
handleExit ProcessId -> ActionHandler s a
h = ExitSignalDispatcher { dispatchExit :: s -> ProcessId -> Message -> Process (Maybe (ProcessAction s))
dispatchExit = (ProcessId -> ActionHandler s a)
-> s -> ProcessId -> Message -> Process (Maybe (ProcessAction s))
doHandleExit ProcessId -> ActionHandler s a
h }
where
doHandleExit :: (ProcessId -> ActionHandler s a)
-> s
-> ProcessId
-> P.Message
-> Process (Maybe (ProcessAction s))
doHandleExit :: (ProcessId -> ActionHandler s a)
-> s -> ProcessId -> Message -> Process (Maybe (ProcessAction s))
doHandleExit ProcessId -> ActionHandler s a
h' s
s ProcessId
p Message
msg = Message
-> (a -> Process (ProcessAction s))
-> Process (Maybe (ProcessAction s))
forall (m :: * -> *) a b.
(Monad m, Serializable a) =>
Message -> (a -> m b) -> m (Maybe b)
handleMessage Message
msg (ProcessId -> ActionHandler s a
h' ProcessId
p s
s)
handleExitIf :: forall s a . (Serializable a)
=> (s -> a -> Bool)
-> (ProcessId -> ActionHandler s a)
-> ExitSignalDispatcher s
handleExitIf :: forall s a.
Serializable a =>
(s -> a -> Bool)
-> (ProcessId -> ActionHandler s a) -> ExitSignalDispatcher s
handleExitIf s -> a -> Bool
c ProcessId -> ActionHandler s a
h = ExitSignalDispatcher { dispatchExit :: s -> ProcessId -> Message -> Process (Maybe (ProcessAction s))
dispatchExit = (s -> a -> Bool)
-> (ProcessId -> ActionHandler s a)
-> s
-> ProcessId
-> Message
-> Process (Maybe (ProcessAction s))
doHandleExit s -> a -> Bool
c ProcessId -> ActionHandler s a
h }
where
doHandleExit :: (s -> a -> Bool)
-> (ProcessId -> ActionHandler s a)
-> s
-> ProcessId
-> P.Message
-> Process (Maybe (ProcessAction s))
doHandleExit :: (s -> a -> Bool)
-> (ProcessId -> ActionHandler s a)
-> s
-> ProcessId
-> Message
-> Process (Maybe (ProcessAction s))
doHandleExit s -> a -> Bool
c' ProcessId -> ActionHandler s a
h' s
s ProcessId
p Message
msg = Message
-> (a -> Bool)
-> (a -> Process (ProcessAction s))
-> Process (Maybe (ProcessAction s))
forall (m :: * -> *) a b.
(Monad m, Serializable a) =>
Message -> (a -> Bool) -> (a -> m b) -> m (Maybe b)
handleMessageIf Message
msg (s -> a -> Bool
c' s
s) (ProcessId -> ActionHandler s a
h' ProcessId
p s
s)
mkReply :: (Serializable b)
=> CallRef b
-> ProcessReply b s
-> Process (ProcessAction s)
mkReply :: forall b s.
Serializable b =>
CallRef b -> ProcessReply b s -> Process (ProcessAction s)
mkReply CallRef b
cRef ProcessReply b s
act
| (NoReply ProcessAction s
a) <- ProcessReply b s
act = ProcessAction s -> Process (ProcessAction s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return ProcessAction s
a
| (CallRef (Recipient
_, CallId
tg')) <- CallRef b
cRef
, (ProcessReply b
r' ProcessAction s
a) <- ProcessReply b s
act = CallRef b -> CallResponse b -> Process ()
forall m.
(Serializable m, Resolvable (CallRef b)) =>
CallRef b -> m -> Process ()
forall a m.
(Routable a, Serializable m, Resolvable a) =>
a -> m -> Process ()
sendTo CallRef b
cRef (b -> CallId -> CallResponse b
forall a. a -> CallId -> CallResponse a
CallResponse b
r' CallId
tg') Process ()
-> Process (ProcessAction s) -> Process (ProcessAction s)
forall a b. Process a -> Process b -> Process b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ProcessAction s -> Process (ProcessAction s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return ProcessAction s
a
| (CallRef (Recipient
_, CallId
ct')) <- CallRef b
cRef
, (ProcessReject String
r' ProcessAction s
a) <- ProcessReply b s
act = CallRef b -> CallRejected -> Process ()
forall m.
(Serializable m, Resolvable (CallRef b)) =>
CallRef b -> m -> Process ()
forall a m.
(Routable a, Serializable m, Resolvable a) =>
a -> m -> Process ()
sendTo CallRef b
cRef (String -> CallId -> CallRejected
CallRejected String
r' CallId
ct') Process ()
-> Process (ProcessAction s) -> Process (ProcessAction s)
forall a b. Process a -> Process b -> Process b
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> ProcessAction s -> Process (ProcessAction s)
forall a. a -> Process a
forall (m :: * -> *) a. Monad m => a -> m a
return ProcessAction s
a
| Bool
otherwise = ExitReason -> Process (ProcessAction s)
forall a b. Serializable a => a -> Process b
die (ExitReason -> Process (ProcessAction s))
-> ExitReason -> Process (ProcessAction s)
forall a b. (a -> b) -> a -> b
$ String -> ExitReason
ExitOther String
"mkReply.InvalidState"
check :: forall s m a . (Serializable m)
=> Condition s m
-> s
-> Message m a
-> Bool
check :: forall s m a.
Serializable m =>
Condition s m -> s -> Message m a -> Bool
check (Condition s -> m -> Bool
c) s
st Message m a
msg = s -> m -> Bool
c s
st (m -> Bool) -> m -> Bool
forall a b. (a -> b) -> a -> b
$ Message m a -> m
forall a b. Message a b -> a
decode Message m a
msg
check (State s -> Bool
c) s
st Message m a
_ = s -> Bool
c s
st
check (Input m -> Bool
c) s
_ Message m a
msg = m -> Bool
c (m -> Bool) -> m -> Bool
forall a b. (a -> b) -> a -> b
$ Message m a -> m
forall a b. Message a b -> a
decode Message m a
msg
checkRpc :: forall s m a . (Serializable m)
=> Condition s m
-> s
-> Message m a
-> Bool
checkRpc :: forall s m a.
Serializable m =>
Condition s m -> s -> Message m a -> Bool
checkRpc Condition s m
cond s
st msg :: Message m a
msg@(ChanMessage m
_ SendPort a
_) = Condition s m -> s -> Message m a -> Bool
forall s m a.
Serializable m =>
Condition s m -> s -> Message m a -> Bool
check Condition s m
cond s
st Message m a
msg
checkRpc Condition s m
_ s
_ Message m a
_ = Bool
False
checkCall :: forall s m a . (Serializable m)
=> Condition s m
-> s
-> Message m a
-> Bool
checkCall :: forall s m a.
Serializable m =>
Condition s m -> s -> Message m a -> Bool
checkCall Condition s m
cond s
st msg :: Message m a
msg@(CallMessage m
_ CallRef a
_) = Condition s m -> s -> Message m a -> Bool
forall s m a.
Serializable m =>
Condition s m -> s -> Message m a -> Bool
check Condition s m
cond s
st Message m a
msg
checkCall Condition s m
_ s
_ Message m a
_ = Bool
False
checkCast :: forall s m . (Serializable m)
=> Condition s m
-> s
-> Message m ()
-> Bool
checkCast :: forall s m.
Serializable m =>
Condition s m -> s -> Message m () -> Bool
checkCast Condition s m
cond s
st msg :: Message m ()
msg@(CastMessage m
_) = Condition s m -> s -> Message m () -> Bool
forall s m a.
Serializable m =>
Condition s m -> s -> Message m a -> Bool
check Condition s m
cond s
st Message m ()
msg
checkCast Condition s m
_ s
_ Message m ()
_ = Bool
False
decode :: Message a b -> a
decode :: forall a b. Message a b -> a
decode (CallMessage a
a CallRef b
_) = a
a
decode (CastMessage a
a) = a
a
decode (ChanMessage a
a SendPort b
_) = a
a