This is just a convenience module that reexports everything you're expected to need.
- data OfferImpls where
- OfferImplsNil :: OfferImpls Nil prog progOut progIn finalState finalResult
- (~||~) :: forall prog prog' progOut progIn outgoing incoming finalState finalResult jumps l. (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, SWellFormedConfig l (D0 E) prog, SWellFormedConfig l (D0 E) prog', Elem progOut l (MVar (ProgramCell (Cell outgoing))), Elem progIn l (MVar (ProgramCell (Cell incoming)))) => SessionChain prog progOut progIn (outgoing, incoming) finalState finalResult -> OfferImpls jumps prog progOut progIn finalState finalResult -> OfferImpls (Cons (Cons (Jump l) Nil) jumps) prog progOut progIn finalState finalResult
- sjump :: forall l prog prog' progOut progIn outgoing incoming. (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, SWellFormedConfig l (D0 E) prog, SWellFormedConfig l (D0 E) prog', Elem progOut l (MVar (ProgramCell (Cell outgoing))), Elem progIn l (MVar (ProgramCell (Cell incoming)))) => SessionChain prog progOut progIn (Cons (Jump l) Nil, Cons (Jump l) Nil) (outgoing, incoming) ()
- soffer :: forall finalState finalResult prog prog' progOut progIn jumps. (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn) => OfferImpls jumps prog progOut progIn finalState finalResult -> SessionChain prog progOut progIn (Cons (Choice jumps) Nil, Cons (Choice jumps) Nil) finalState finalResult
- sselect :: forall prog prog' progOut progIn label jumps outgoing incoming len jumpTarget. (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, ListLength jumps len, SmallerThan label len, TypeNumberToInt label, Elem jumps label (Cons (Jump jumpTarget) Nil), SWellFormedConfig jumpTarget (D0 E) prog, SWellFormedConfig jumpTarget (D0 E) prog', Elem progOut jumpTarget (MVar (ProgramCell (Cell outgoing))), Elem progIn jumpTarget (MVar (ProgramCell (Cell incoming)))) => label -> SessionChain prog progOut progIn (Cons (Choice jumps) Nil, Cons (Choice jumps) Nil) (outgoing, incoming) ()
- ssend :: forall t prog prog' progOut progIn nxt incoming. (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn) => t -> SessionChain prog progOut progIn (Cons t nxt, incoming) (nxt, incoming) ()
- srecv :: forall t prog prog' progOut progIn nxt outgoing. (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn) => SessionChain prog progOut progIn (outgoing, Cons t nxt) (outgoing, nxt) t
- run :: forall prog prog' progOut progIn init fromO fromI toO toI toO' toI' res res'. (Dual prog prog', Dual prog' prog, ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, SWellFormedConfig init (D0 E) prog, SWellFormedConfig init (D0 E) prog', Elem progOut init (MVar (ProgramCell (Cell fromO))), Elem progIn init (MVar (ProgramCell (Cell fromI)))) => prog -> init -> SessionChain prog progOut progIn (fromO, fromI) (toO, toI) res -> SessionChain prog' progIn progOut (fromI, fromO) (toO', toI') res' -> IO (res, res')
- data End
- data Send where
- data Recv where
- data Jump l
- data Select
- data Offer
- jump :: TyNum n => n -> Cons (Jump n) Nil
- end :: Cons End Nil
- select :: SListOfJumps (Cons val nxt) => Cons val nxt -> Cons (Select (Cons val nxt)) Nil
- offer :: SListOfJumps (Cons val nxt) => Cons val nxt -> Cons (Offer (Cons val nxt)) Nil
- class Dual a b | a -> b, b -> a where
- dual :: a -> b
- (~>) :: (TyList nxt, SNonTerminal a, SValidSessionType nxt) => a -> nxt -> Cons a nxt
- (~|~) :: (TyNum target, TyList nxt) => target -> nxt -> Cons (Cons (Jump target) Nil) nxt
- class SWellFormedConfig idxA idxB ss
- testWellformed :: SWellFormedConfig idxA idxB ss => ss -> idxA -> idxB -> Bool
- data Cons
- cons :: TyList n => t -> n -> Cons t n
- data Nil
- nil :: Nil
- data E = E
- data D0 n = D0 n
- data D1 n = D1 n
- data D2 n = D2 n
- data D3 n = D3 n
- data D4 n = D4 n
- data D5 n = D5 n
- data D6 n = D6 n
- data D7 n = D7 n
- data D8 n = D8 n
- data D9 n = D9 n
- module Control.Concurrent.Session.SMonad
Documentation
data OfferImpls whereSource
Use OfferImpls to construct the implementations of the branches of an offer. Really, it's just a slightly fancy list.
OfferImplsNil :: OfferImpls Nil prog progOut progIn finalState finalResult |
(~||~) :: forall prog prog' progOut progIn outgoing incoming finalState finalResult jumps l. (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, SWellFormedConfig l (D0 E) prog, SWellFormedConfig l (D0 E) prog', Elem progOut l (MVar (ProgramCell (Cell outgoing))), Elem progIn l (MVar (ProgramCell (Cell incoming)))) => SessionChain prog progOut progIn (outgoing, incoming) finalState finalResult -> OfferImpls jumps prog progOut progIn finalState finalResult -> OfferImpls (Cons (Cons (Jump l) Nil) jumps) prog progOut progIn finalState finalResultSource
Use to construct OfferImpls. This function automatically adds the
necessary sjump
to the start of each branch implementation.
sjump :: forall l prog prog' progOut progIn outgoing incoming. (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, SWellFormedConfig l (D0 E) prog, SWellFormedConfig l (D0 E) prog', Elem progOut l (MVar (ProgramCell (Cell outgoing))), Elem progIn l (MVar (ProgramCell (Cell incoming)))) => SessionChain prog progOut progIn (Cons (Jump l) Nil, Cons (Jump l) Nil) (outgoing, incoming) ()Source
Perform a jump. Now you may think that you should indicate where you want to jump to. But of coures, that's actually specified by the session type so you don't have to specify it at all in the implementation.
soffer :: forall finalState finalResult prog prog' progOut progIn jumps. (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn) => OfferImpls jumps prog progOut progIn finalState finalResult -> SessionChain prog progOut progIn (Cons (Choice jumps) Nil, Cons (Choice jumps) Nil) finalState finalResultSource
Offer a number of branches. This is basically an external choice
- the other party uses sselect
to decide which branch to take.
Use OfferImpls in order to construct the list of implementations of
branches. Note that every implementation must result in the same
final state and emit the same value.
sselect :: forall prog prog' progOut progIn label jumps outgoing incoming len jumpTarget. (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, ListLength jumps len, SmallerThan label len, TypeNumberToInt label, Elem jumps label (Cons (Jump jumpTarget) Nil), SWellFormedConfig jumpTarget (D0 E) prog, SWellFormedConfig jumpTarget (D0 E) prog', Elem progOut jumpTarget (MVar (ProgramCell (Cell outgoing))), Elem progIn jumpTarget (MVar (ProgramCell (Cell incoming)))) => label -> SessionChain prog progOut progIn (Cons (Choice jumps) Nil, Cons (Choice jumps) Nil) (outgoing, incoming) ()Source
Select which branch we're taking at a branch point. Use a type number (Control.Concurrent.Session.Number) to indicate the branch to take.
ssend :: forall t prog prog' progOut progIn nxt incoming. (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn) => t -> SessionChain prog progOut progIn (Cons t nxt, incoming) (nxt, incoming) ()Source
Send a value to the other party. Of course, the value must be of the correct type indicated in the session type.
srecv :: forall t prog prog' progOut progIn nxt outgoing. (Dual prog prog', ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn) => SessionChain prog progOut progIn (outgoing, Cons t nxt) (outgoing, nxt) tSource
Recieve a value from the other party. This will block as necessary. The type of the value received is specified by the session type. No magic coercion needed.
run :: forall prog prog' progOut progIn init fromO fromI toO toI toO' toI' res res'. (Dual prog prog', Dual prog' prog, ProgramToMVarsOutgoing prog progOut, ProgramToMVarsOutgoing prog' progIn, SWellFormedConfig init (D0 E) prog, SWellFormedConfig init (D0 E) prog', Elem progOut init (MVar (ProgramCell (Cell fromO))), Elem progIn init (MVar (ProgramCell (Cell fromI)))) => prog -> init -> SessionChain prog progOut progIn (fromO, fromI) (toO, toI) res -> SessionChain prog' progIn progOut (fromI, fromO) (toO', toI') res' -> IO (res, res')Source
Run! Provide a program and a start point within that program
(which is automatically sjump
ed to), the two implementations
which must be duals of each other, run them, have them communicate,
wait until they both finish and die and then return the results
from both of them.
Send :: t -> Send t | |
SendInt :: Send Int | |
SendBool :: Send Bool | |
SendChar :: Send Char | |
SendStr :: Send String | |
SendDouble :: Send Double |
SNonTerminal (Send t) | |
SNoJumpsBeyond (Send t) idx | |
Dual (Recv t) (Send t) | |
Dual (Send t) (Recv t) | |
OnlyOutgoing nxt nxt' => OnlyOutgoing (Cons (Send t) nxt) (Cons t nxt') |
Recv :: t -> Recv t | |
RecvInt :: Recv Int | |
RecvBool :: Recv Bool | |
RecvChar :: Recv Char | |
RecvStr :: Recv String | |
RecvDouble :: Recv Double |
SNonTerminal (Recv t) | |
SNoJumpsBeyond (Recv t) idx | |
Dual (Recv t) (Send t) | |
Dual (Send t) (Recv t) | |
OnlyOutgoing nxt nxt' => OnlyOutgoing (Cons (Recv t) nxt) nxt' |
(~>) :: (TyList nxt, SNonTerminal a, SValidSessionType nxt) => a -> nxt -> Cons a nxtSource
class SWellFormedConfig idxA idxB ss Source
(SListOfSessionTypes ss, ListLength ss len, SNoJumpsBeyond ss len, SmallerThan idxA len, Elem ss idxA st, ListLength st len', SmallerThan idxB len') => SWellFormedConfig idxA idxB ss |
testWellformed :: SWellFormedConfig idxA idxB ss => ss -> idxA -> idxB -> BoolSource
Show Nil | |
TyList Nil | |
SListOfSessionTypes Nil | |
SListOfJumps Nil | |
SNoJumpsBeyond Nil idx | |
Dual Nil Nil | |
ProgramToMVarsOutgoing Nil Nil | |
ListLength Nil (D0 E) | |
STerminal a => SValidSessionType (Cons a Nil) | |
(SListOfJumps nxt, TyNum val) => SListOfJumps (Cons (Cons (Jump val) Nil) nxt) | |
OnlyOutgoing (Cons (Offer jl) Nil) (Cons (Choice jl) Nil) | |
OnlyOutgoing (Cons (Select jl) Nil) (Cons (Choice jl) Nil) | |
OnlyOutgoing (Cons (Jump l) Nil) (Cons (Jump l) Nil) | |
OnlyOutgoing (Cons End Nil) (Cons End Nil) |
Show E | |
Reverse' E a a | |
IncrementRightToLeft E (D1 E) | |
ListLength Nil (D0 E) | |
Pred m m' => Add m (D0 E) m | |
TypeNumberToInt (D0 E) | |
TyNum (D9 E) | |
TyNum (D8 E) | |
TyNum (D7 E) | |
TyNum (D6 E) | |
TyNum (D5 E) | |
TyNum (D4 E) | |
TyNum (D3 E) | |
TyNum (D2 E) | |
TyNum (D1 E) | |
TyNum (D0 E) | |
Pred y y' => SmallerThan (D0 E) y | |
Pred n n' => Add (D0 E) n n | |
StripLeadingZeros (D0 E) (D0 E) | |
Add (D0 E) (D0 E) (D0 E) | |
Elem (Cons res nxt) (D0 E) res |
D0 n |
ListLength Nil (D0 E) | |
Pred m m' => Add m (D0 E) m | |
Show n => Show (D0 n) | |
TypeNumberToInt (D0 E) | |
TyNum n => TyNum (D0 n) | |
TyNum (D0 E) | |
Pred y y' => SmallerThan (D0 E) y | |
StripLeadingZeros a b => StripLeadingZeros (D0 a) b | |
Pred n n' => Add (D0 E) n n | |
Reverse' n (D0 a) r => Reverse' (D0 n) a r | |
StripLeadingZeros (D0 E) (D0 E) | |
DecrementRightToLeft (D1 a) (D0 a) | |
DecrementRightToLeft a b => DecrementRightToLeft (D0 a) (D9 b) | |
IncrementRightToLeft a b => IncrementRightToLeft (D9 a) (D0 b) | |
IncrementRightToLeft (D0 a) (D1 a) | |
Add (D0 E) (D0 E) (D0 E) | |
Elem (Cons res nxt) (D0 E) res |
D1 n |
IncrementRightToLeft E (D1 E) | |
Show n => Show (D1 n) | |
TyNum n => TyNum (D1 n) | |
TyNum (D1 E) | |
Reverse' n (D1 a) r => Reverse' (D1 n) a r | |
StripLeadingZeros (D1 a) (D1 a) | |
DecrementRightToLeft (D2 a) (D1 a) | |
DecrementRightToLeft (D1 a) (D0 a) | |
IncrementRightToLeft (D1 a) (D2 a) | |
IncrementRightToLeft (D0 a) (D1 a) |
D2 n |
D3 n |
D4 n |
D5 n |
D6 n |
D7 n |
D8 n |
D9 n |
Show n => Show (D9 n) | |
TyNum n => TyNum (D9 n) | |
TyNum (D9 E) | |
Reverse' n (D9 a) r => Reverse' (D9 n) a r | |
StripLeadingZeros (D9 a) (D9 a) | |
DecrementRightToLeft (D9 a) (D8 a) | |
DecrementRightToLeft a b => DecrementRightToLeft (D0 a) (D9 b) | |
IncrementRightToLeft a b => IncrementRightToLeft (D9 a) (D0 b) | |
IncrementRightToLeft (D8 a) (D9 a) |