|
Control.Concurrent.Session.Interleaving |
|
|
Description |
A single thread should be able to have multiple concurrent
conversations with other threads. So this module places
InterleavedChain as an instance of SMonad, and equipts it with
the capability to manage and modify a mapping of channels to other
threads. Note there is some danger in here. Deadlocks can start to
appear if you're silly or deliberately mean. However, this is
starting to get towards the Actor / Erlang model of message
passing.
|
|
Synopsis |
|
type InterleavedChain f t res = SChain IO f t res | | withChannel :: (MapLookup (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (fromO, fromI)), MapUpdate (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (toO, toI)) (TyMap keyToIdx idxToValue')) => idx -> SessionChain prog progOut progIn (fromO, fromI) (toO, toI) res -> InterleavedChain (TyMap keyToIdx idxToValue) (TyMap keyToIdx idxToValue') res | | createChannel :: forall prog prog' progOut progIn init fromO fromI keyToIdxMe idxToValueMe keyToIdxMe' idxToValueMe' keyToIdxChild' idxToValueChild' keyToIdxChild'' idxToValueChild'' idxOfChild. (Dual prog prog', Dual prog' prog, ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, SWellFormedConfig init (D0 E) prog, SWellFormedConfig init (D0 E) prog', TyListIndex progOut init (MVar (ProgramCell (Cell fromO))), TyListIndex progIn init (MVar (ProgramCell (Cell fromI))), MapSize (TyMap keyToIdxMe idxToValueMe) idxOfChild, MapInsert (TyMap keyToIdxMe idxToValueMe) idxOfChild (SessionState prog progOut progIn (fromO, fromI)) (TyMap keyToIdxMe' idxToValueMe'), MapInsert (TyMap Nil Nil) (D0 E) (SessionState prog' progIn progOut (fromI, fromO)) (TyMap keyToIdxChild' idxToValueChild')) => prog -> init -> (D0 E -> InterleavedChain (TyMap keyToIdxChild' idxToValueChild') (TyMap keyToIdxChild'' idxToValueChild'') ()) -> InterleavedChain (TyMap keyToIdxMe idxToValueMe) (TyMap keyToIdxMe' idxToValueMe') idxOfChild | | createChannel' :: forall prog prog' progOut progIn init fromO fromI keyToIdxMe idxToValueMe keyToIdxMe' idxToValueMe' keyToIdxChild idxToValueChild keyToIdxChild' idxToValueChild' keyToIdxChild'' idxToValueChild'' idxOfChild idxOfMe. (Dual prog prog', Dual prog' prog, ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, SWellFormedConfig init (D0 E) prog, SWellFormedConfig init (D0 E) prog', TyListIndex progOut init (MVar (ProgramCell (Cell fromO))), TyListIndex progIn init (MVar (ProgramCell (Cell fromI))), MapSize (TyMap keyToIdxMe idxToValueMe) idxOfChild, MapSize (TyMap keyToIdxChild idxToValueChild) idxOfMe, MapInsert (TyMap keyToIdxMe idxToValueMe) idxOfChild (SessionState prog progOut progIn (fromO, fromI)) (TyMap keyToIdxMe' idxToValueMe'), MapInsert (TyMap keyToIdxChild idxToValueChild) idxOfMe (SessionState prog' progIn progOut (fromI, fromO)) (TyMap keyToIdxChild' idxToValueChild')) => prog -> init -> TyMap keyToIdxChild idxToValueChild -> (idxOfMe -> InterleavedChain (TyMap keyToIdxChild' idxToValueChild') (TyMap keyToIdxChild'' idxToValueChild'') ()) -> InterleavedChain (TyMap keyToIdxMe idxToValueMe) (TyMap keyToIdxMe' idxToValueMe') idxOfChild | | runInterleaved :: InterleavedChain (TyMap Nil Nil) (TyMap keyToIdx idxToValue) res -> IO res | | sjumpCh :: (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, MapLookup (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (Cons (Jump l) Nil, Cons (Jump l) Nil)), MapUpdate (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (outgoing, incoming)) (TyMap keyToIdx idxToValue'), SWellFormedConfig l (D0 E) prog, SWellFormedConfig l (D0 E) prog', TyListIndex progOut l (MVar (ProgramCell (Cell outgoing))), TyListIndex progIn l (MVar (ProgramCell (Cell incoming)))) => idx -> InterleavedChain (TyMap keyToIdx idxToValue) (TyMap keyToIdx idxToValue') () | | ssendCh :: (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, MapLookup (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (Cons t nxt, incoming)), MapUpdate (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (nxt, incoming)) (TyMap keyToIdx idxToValue')) => idx -> t -> InterleavedChain (TyMap keyToIdx idxToValue) (TyMap keyToIdx idxToValue') () | | srecvCh :: (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, MapLookup (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (outgoing, Cons t nxt)), MapUpdate (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (outgoing, nxt)) (TyMap keyToIdx idxToValue')) => idx -> InterleavedChain (TyMap keyToIdx idxToValue) (TyMap keyToIdx idxToValue') t | | sofferCh :: (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, MapLookup (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (Cons (Choice jumps) Nil, Cons (Choice jumps) Nil)), MapUpdate (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (outgoing, incoming)) (TyMap keyToIdx idxToValue')) => idx -> OfferImpls jumps prog progOut progIn (outgoing, incoming) finalResult -> InterleavedChain (TyMap keyToIdx idxToValue) (TyMap keyToIdx idxToValue') finalResult | | sselectCh :: (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, MapLookup (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (Cons (Choice jumps) Nil, Cons (Choice jumps) Nil)), MapUpdate (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (outgoing, incoming)) (TyMap keyToIdx idxToValue'), TyListLength jumps len, SmallerThan label len, TypeNumberToInt label, TyListIndex jumps label (Cons (Jump jumpTarget) Nil), SWellFormedConfig jumpTarget (D0 E) prog, SWellFormedConfig jumpTarget (D0 E) prog', TyListIndex progOut jumpTarget (MVar (ProgramCell (Cell outgoing))), TyListIndex progIn jumpTarget (MVar (ProgramCell (Cell incoming)))) => idx -> label -> InterleavedChain (TyMap keyToIdx idxToValue) (TyMap keyToIdx idxToValue') () |
|
|
Documentation |
|
|
|
|
Perform the given actions on the given channel. Note that the
value emitted by the actions will be passed out.
|
|
createChannel :: forall prog prog' progOut progIn init fromO fromI keyToIdxMe idxToValueMe keyToIdxMe' idxToValueMe' keyToIdxChild' idxToValueChild' keyToIdxChild'' idxToValueChild'' idxOfChild. (Dual prog prog', Dual prog' prog, ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, SWellFormedConfig init (D0 E) prog, SWellFormedConfig init (D0 E) prog', TyListIndex progOut init (MVar (ProgramCell (Cell fromO))), TyListIndex progIn init (MVar (ProgramCell (Cell fromI))), MapSize (TyMap keyToIdxMe idxToValueMe) idxOfChild, MapInsert (TyMap keyToIdxMe idxToValueMe) idxOfChild (SessionState prog progOut progIn (fromO, fromI)) (TyMap keyToIdxMe' idxToValueMe'), MapInsert (TyMap Nil Nil) (D0 E) (SessionState prog' progIn progOut (fromI, fromO)) (TyMap keyToIdxChild' idxToValueChild')) => prog -> init -> (D0 E -> InterleavedChain (TyMap keyToIdxChild' idxToValueChild') (TyMap keyToIdxChild'' idxToValueChild'') ()) -> InterleavedChain (TyMap keyToIdxMe idxToValueMe) (TyMap keyToIdxMe' idxToValueMe') idxOfChild | Source |
|
This is a sane wrapper around createChannel'. The difference is
that this version ensures the child starts off only knowing about
the parent, which is clearly the sanest idea.
|
|
createChannel' :: forall prog prog' progOut progIn init fromO fromI keyToIdxMe idxToValueMe keyToIdxMe' idxToValueMe' keyToIdxChild idxToValueChild keyToIdxChild' idxToValueChild' keyToIdxChild'' idxToValueChild'' idxOfChild idxOfMe. (Dual prog prog', Dual prog' prog, ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, SWellFormedConfig init (D0 E) prog, SWellFormedConfig init (D0 E) prog', TyListIndex progOut init (MVar (ProgramCell (Cell fromO))), TyListIndex progIn init (MVar (ProgramCell (Cell fromI))), MapSize (TyMap keyToIdxMe idxToValueMe) idxOfChild, MapSize (TyMap keyToIdxChild idxToValueChild) idxOfMe, MapInsert (TyMap keyToIdxMe idxToValueMe) idxOfChild (SessionState prog progOut progIn (fromO, fromI)) (TyMap keyToIdxMe' idxToValueMe'), MapInsert (TyMap keyToIdxChild idxToValueChild) idxOfMe (SessionState prog' progIn progOut (fromI, fromO)) (TyMap keyToIdxChild' idxToValueChild')) => prog -> init -> TyMap keyToIdxChild idxToValueChild -> (idxOfMe -> InterleavedChain (TyMap keyToIdxChild' idxToValueChild') (TyMap keyToIdxChild'' idxToValueChild'') ()) -> InterleavedChain (TyMap keyToIdxMe idxToValueMe) (TyMap keyToIdxMe' idxToValueMe') idxOfChild | Source |
|
Think of this as spawn of fork - it creates a child thread
which must be prepared to communicate with you. You get a channel
set up to the child which is emitted by this function. The child is
first told about the channel back to you. The child can go off and
do what ever it wants, including creating additional channels. The
child starts off with the childMap you supply, extended with the
new channel from you to the child. Note that you're asking for
trouble if you try creating a child without an emptyMap as
channels (and sessions in general) are not in any way designed to
be shared between more than two parties at a time.
|
|
|
Run the root. Use this to start up a family from a single root.
|
|
sjumpCh :: (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, MapLookup (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (Cons (Jump l) Nil, Cons (Jump l) Nil)), MapUpdate (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (outgoing, incoming)) (TyMap keyToIdx idxToValue'), SWellFormedConfig l (D0 E) prog, SWellFormedConfig l (D0 E) prog', TyListIndex progOut l (MVar (ProgramCell (Cell outgoing))), TyListIndex progIn l (MVar (ProgramCell (Cell incoming)))) => idx -> InterleavedChain (TyMap keyToIdx idxToValue) (TyMap keyToIdx idxToValue') () | Source |
|
Convenience combination of withChannel and sjump
|
|
|
Convenience combination of withChannel and ssend
|
|
|
Convenience combination of withChannel and srecv
|
|
|
Convenience combination of withChannel and soffer
|
|
sselectCh :: (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, MapLookup (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (Cons (Choice jumps) Nil, Cons (Choice jumps) Nil)), MapUpdate (TyMap keyToIdx idxToValue) idx (SessionState prog progOut progIn (outgoing, incoming)) (TyMap keyToIdx idxToValue'), TyListLength jumps len, SmallerThan label len, TypeNumberToInt label, TyListIndex jumps label (Cons (Jump jumpTarget) Nil), SWellFormedConfig jumpTarget (D0 E) prog, SWellFormedConfig jumpTarget (D0 E) prog', TyListIndex progOut jumpTarget (MVar (ProgramCell (Cell outgoing))), TyListIndex progIn jumpTarget (MVar (ProgramCell (Cell incoming)))) => idx -> label -> InterleavedChain (TyMap keyToIdx idxToValue) (TyMap keyToIdx idxToValue') () | Source |
|
Convenience combination of withChannel and sselectCh
|
|
Produced by Haddock version 2.3.0 |