sessions-2008.2.28: Session Types for HaskellSource codeContentsIndex
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
type InterleavedChain f t res = SChain IO f t resSource
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') resSource
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') idxOfChildSource
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') idxOfChildSource
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.
runInterleaved :: InterleavedChain (TyMap Nil Nil) (TyMap keyToIdx idxToValue) res -> IO resSource
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
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') ()Source
Convenience combination of withChannel and ssend
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') tSource
Convenience combination of withChannel and srecv
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') finalResultSource
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