úÎVMÔ–      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•MConvert a type-level number to an Int. Of course, we can only go this way...     %Reverse a list. )*Take from the head of a list. Mirrors the Prelude function – . +*Drop from the head of a list. Mirrors the Prelude function — . -'Append two lists together. Mirrors the Prelude function '(++)'. /BUpdate a list but allow the type of the new value to be different ! from the type of the old value. 1AIndex or update a list. When updating, the type of the new value 0 must be the same as the type of the old value. 5Find the length of a list.  !"#$%&'()*+,-./0123456788756 !"#$4123/0)*+,-.%&'(:Find the size of a map. <>A helper class - the ability to modify a value in the map and  immediately update the map. >?Update a map. The key must already be in the map. The value is A the type of the value, if you see what I mean and so obviously, 8 updating the map means changing the type of the value. @.Lookup in a map. Will call fail in Monad if it' s not there. B:Insert into a map. Remember, the values are irrelevant, it's only  the types that matter. 9:;<=>?@ABCD D9BC@A>?<=:;*EFGHIJKLMN˜OPQRSTUVWX™YšZ›[\]^_`abcdefghiœEFGHIJKLMNOPQRSTUVWXYZ[bisAAn extension of the typical Monad such that you track additional  from and to- parameters. Thus you can think of this like  ž   where the type of the  ž  varies. jklmnopqŸrstuvw xjklmnopqrstuvwx yBUse to construct OfferImpls. This function automatically adds the  necessary z- to the start of each branch implementation. zAPerform 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. {ASend a value to the other party. Of course, the value must be of 1 the correct type indicated in the session type. |9Recieve 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. }AOffer a number of branches. This is basically an external choice  - the other party uses ~! to decide which branch to take. E Use OfferImpls in order to construct the list of implementations of B branches. Note that every implementation must result in the same & final state and emit the same value. ~Select which branch we'(re taking at a branch point. Use a type  number (!Control.Concurrent.Session.Number) to indicate the branch  to take. =Run! Provide a program and a start point within that program  (which is automatically z ed to), the two implementations E which must be duals of each other, run them, have them communicate, A wait until they both finish and die and then return the results  from both of them. €=The representation of a computation that performs work using D session types. Again, really quite similar to a more-parameterized  State monad. ‰@Use OfferImpls to construct the implementations of the branches  of an offer. Really, it's just a slightly fancy list. yz{|}~€‚ƒ„…†‡ˆ‰‹‰‹yƒ„€‚z{|}~…†‡ˆ Œ>Perform the given actions on the given channel. Note that the 2 value emitted by the actions will be passed out. This is a sane wrapper around Ž. The difference is C that this version ensures the child starts off only knowing about / the parent, which is clearly the sanest idea. ŽThink of this as spawn of fork - it creates a child thread C which must be prepared to communicate with you. You get a channel E set up to the child which is emitted by this function. The child is D first told about the channel back to you. The child can go off and D do what ever it wants, including creating additional channels. The B child starts off with the childMap you supply, extended with the 1 new channel from you to the child. Note that you're asking for 0 trouble if you try creating a child without an 9 as C 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. Convenience combination of Œ and z ‘Convenience combination of Œ and { ’Convenience combination of Œ and | “Convenience combination of Œ and } ”Convenience combination of Œ and ” ŒŽ‘’“”• •ŒŽ‘’“”[  !789EFGHIJKOVWXYZ[\]^_`abcdefghijklmnopqŸrstuvw xyz{|}~‰‹ŒŽ‘’“”•A‰Š‹yz}~{|ibcdefgh[\]^_`aZYXFEGHVWIJOK7!8  9¡   !!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`ab]cdefghcijklmnopqrstuvwxyz{|}~€€‚‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“ ” •PZ[\i – –qw—sessions-2008.2.28!Control.Concurrent.Session.NumberControl.Concurrent.Session.ListControl.Concurrent.Session.Map&Control.Concurrent.Session.SessionTypeControl.Concurrent.Session!Control.Concurrent.Session.SMonad"Control.Concurrent.Session.Runtime'Control.Concurrent.Session.InterleavingbaseGHC.List mtl-1.1.0.2Control.Monad.State.LazyTypeNumberToInt tyNumToIntTyNum SmallerThanAddtyAddPredtyPredSucctySuccD9D8D7D6D5D4D3D2D1D0Enilcons modifyConstyHeadtyTail TyListReverse tyListReverse TyListElem tyListElem TyListTake tyListTake TyListDrop tyListDrop TyListAppend tyListAppendTyListUpdateVartyListUpdateVar TyListIndex tyListIndex tyListUpdateTyList TyListLength tyListLengthConsNilemptyMapMapSizemapSizeMapWithmapWith MapUpdate mapUpdate MapLookup mapLookup MapInsert mapInsertTyMapendjumpselectoffer~>~|~testWellformed OnlyOutgoing onlyOutgoingChoiceSWellFormedConfigSNoJumpsBeyondSValidSessionType STerminal SNonTerminalSListOfSessionTypes SListOfJumpsDualdualOfferSelectJumpRecv RecvDoubleRecvStrRecvCharRecvBoolRecvIntSend SendDoubleSendStrSendCharSendBoolSendIntEnd SMonadStatesgetsputSMonadIOsliftIO SMonadTranssliftSStateT runSStateTSMonad~>>~>>=sreturnSChain runSChain~||~sjumpssendsrecvsoffersselectrun SessionChainrunSessionChain SessionStateProgramToMVarsOutgoingprogramToMVarsOutgoing ProgramCellCell OfferImpls OfferCons OfferImplsNil withChannel createChannelcreateChannel'runInterleavedsjumpChssendChsrecvChsofferCh sselectChInterleavedChaintakedropState