úÎcÜXkÔ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Â Ã Ä Å Æ Ç È É Ê Ë Ì Í Î Ï Ğ Ñ Ò Ó    MConvert a type-level number to an Int. Of course, we can only go this way... " !"#$%&'()*+,-./0"/0-.+,)*'(%&#$!" BReverse a list. F*Take from the head of a list. Mirrors the Prelude function Ô . H*Drop from the head of a list. Mirrors the Prelude function Õ . J'Append two lists together. Mirrors the Prelude function '(++)'. LBUpdate a list but allow the type of the new value to be different ! from the type of the old value. NAIndex or update a list. When updating, the type of the new value 0 must be the same as the type of the old value. RFind the length of a list. %123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTU%UTRS12345QNOPLMFGHIJKBCDE@A>?<=:;89674VWXYZ[\]^_`abcÖdefghijklmno×pØqÙrstuvwxyz{|}~€ÚÛ‚Ü!VWXYZ[\]^_`abcdefghijklmnopqry€‚‡Find the size of a 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. :Insert into a map. Remember, the values are irrelevant, it's only C the types that matter. Inserting a key that already exists is not  permitted. ƒ„…†‡ˆ‰Š‹Œƒ‹Œ‰Š‡ˆ„…†šAAn 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. ‘’“”•–—˜ß™š›œàŸ‘’“”•–—˜™š›œŸ ¡BUse to construct OfferImpls. This function automatically adds the  necessary ¢- to the start of each branch implementation. ¢APerform a jump. Now you may think that you should indicate where ) you want to jump to. But of course, 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 ¢ 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.  ¡¢£¤¥¦§¨©ª«¬­®¯°±³±³¡«¬¨©ª¢£¤¥¦§­ ®¯° ½+Provides the ability to make a new session / channel with the B given Pid. Supply the index to the Session Type, whether or not  you'>re locally inverting (dualing) the Session Type, and the Pid, @ and so long as the Pid supports the dual of your local Session C Type, this will block until the Pid gets around to servicing you. A Thus this is a synchronous operation and both Pids must know of $ each other to create a new session / channel between them. Ä@Provides a way to compare two Pids. Of course, if the Pids have B different type params, then they are definitely different, but it's @ still convenient to be able to do something like (==) on them. ÈMA process ID. This is a tiny bit like ThreadId but rather heavily annotated. ´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÈÉÆÇ¶·µ¸ÁÂÿ´À½¾ÄÅ»¼¹º Ê>Perform the given actions on the given channel. Note that the 2 value emitted by the actions will be passed out. Ë@Run the root. Use this to start up a family from a single root. ÌConvenience combination of Ê  and ¢ ÍConvenience combination of Ê  and £ ÎConvenience combination of Ê  and ¤ ÏConvenience combination of Ê  and ¥ ĞConvenience combination of Ê  and Ğ  ÒThink of this as spawn or 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 B first told about the channel back to you and your Pid. The child E can go off and do what ever it wants, including creating additional C channels. The child starts off knowing with only one open channel  which is to the parent. ÊËÌÍÎÏĞÑÒÓ ÊÒÓËÌÍÎÏĞÑs  !"#$%&'()*+,-./012TUWXYZ[\]^_`dmnopqrstuvwxyz{|}~‚ƒ‘’“”•–—˜ß™š›œàŸ¡¢£¤¥¦§¨±³´¸¹º»¼½¾¿ÀÁÂÃÄÅÈÊËÌÍÎÏĞÑÒÓY ±²³¡¢¥¦£¤§‚yz{|}~rstuvwxYZqpo[X\]mWn^_d`¨T2U1/0-.+,)*'(%&#$!" ƒÈÁÂÿ´À½¾¸ÄÅ»¼¹ºá !"#$%&'()**++,,--..//001122334456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{v|}~€|‚ƒ„…†‡ˆ‰Š‹Œ‘’“”•–—˜™š›œŸ ¡¢£¤¥¦§¨©ªª«¬¬­®¯°±²³ ´ µ ¶ · ¸ ¹ º » ¼ ½ ¾ ¿ À Á Á  Ã Ä Å Æ Ç Ç È É Ê Ë Ì Í Î Ï Ğ Ñ Ò Ógstu‚ƒ„ Ô Ôš Õsessions-2008.3.29Control.Concurrent.Session.BoolControl.Concurrent.Session!Control.Concurrent.Session.NumberControl.Concurrent.Session.List&Control.Concurrent.Session.SessionTypeControl.Concurrent.Session.Map!Control.Concurrent.Session.SMonad"Control.Concurrent.Session.RuntimeControl.Concurrent.Session.Pid'Control.Concurrent.Session.InterleavingbaseGHC.List mtl-1.1.0.2Control.Monad.State.LazyNotNotTtyNotIftyIfOrtyOrAndtyAndFalseFFTrueTT:.:$TypeNumberToInt tyNumToIntTyNumSmallerThanBool isSmallerThan SmallerThanAddtyAddPredtyPredSucctySuccD9D8D7D6D5D4D3D2D1D0Enilcons modifyConstyHeadtyTail TyListMapFunc tyListMapFunc TyListMap tyListMapTyListSortNumstyListSortNums TyListToSet tyListToSet TyListConsSet tyListConsSet TyListMemberisTyListMember TyListReverse tyListReverse TyListElem tyListElem TyListTake tyListTake TyListDrop tyListDrop TyListAppend tyListAppendTyListUpdateVartyListUpdateVar TyListIndex tyListIndex tyListUpdateTyList TyListLength tyListLengthConsNilOutgoingDualTendsendPidrecvPidjumpselectoffer~>~|~testWellformed ExpandPids expandPidsChoiceSWellFormedConfigMakeListOfJumpsmakeListOfJumpsSNoJumpsBeyondSValidSessionType STerminal SNonTerminalSListOfSessionTypes SListOfJumpsDualdualOfferSelectJumpRecv RecvDoubleRecvStrRecvCharRecvBoolRecvIntSend SendDoubleSendStrSendCharSendBoolSendIntRecvPidSendPidEndemptyMap tyMapKeys MapDelete mapDeleteMapSizemapSize MapUpdate mapUpdate MapLookup mapLookup MapInsert mapInsertTyMapTM SMonadStatesgetsputSMonadIOsliftIO SMonadTranssliftSStateT runSStateTSMonad~>>~>>=sreturnSChain runSChainProgramToMVarsOutgoingT~||~sjumpssendsrecvsoffersselectrun SessionChainrunSessionChain SessionStateProgramToMVarsOutgoingprogramToMVarsOutgoing ProgramCellCell OfferImpls OfferCons OfferImplsNilBuildPidTyMapT iPidToPidmakePidrootPidmyPid~|||~ multiReceive MultiReceiveMultiReceiveNil CreateSession createSession BuildPidTyMap buildPidTyMapInterleavedChainrunInterleavedChainPidEq=~= InternalPidIPidPid withChannelrunInterleavedsjumpChssendChsrecvChsofferCh sselectChscloseChForkforktakedropState