śĪbaWÉ      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ”¢£¤„¦§Ø©Ŗ«¬­® Æ ° ± ² ³ “ µ ¶ · ø ¹ ŗ » ¼ ½ ¾ æ Ą Į Ā Ć Ä Å Ę Ē Č    MConvert a type-level number to an Int. Of course, we can only go this way... " !"#$%&'()*+,-./0"/0-.+,)*'(%&#$!" >Reverse a list. B*Take from the head of a list. Mirrors the Prelude function É . D*Drop from the head of a list. Mirrors the Prelude function Ź . F'Append two lists together. Mirrors the Prelude function '(++)'. HBUpdate a list but allow the type of the new value to be different ! from the type of the old value. JAIndex or update a list. When updating, the type of the new value 0 must be the same as the type of the old value. NFind the length of a list. !123456789:;<=>?@ABCDEFGHIJKLMNOPQ!QPNO12345MJKLHIBCDEFG>?@A<=:;89674RSTUVWXYZ[\]^_Ė`abcdefghijkĢlĶmĪnopqrstuvwxyz{|Ļ}Š~Ń!RSTUVWXYZ[\]^_`abcdefghijklmnu|}~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 A the types that matter. Inserting a key that already exists will  update the value. €‚ƒ„…†‡ˆ‰Š ‰Š‡ˆ…†ƒ„‚€”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. ĄĮĀĆÄÅĘĒČ ĄĒČĮĀĆÄÅĘn  !"#$%&'()*+,-./012PQSTUVWXYZ[\`ijklmnopqrstuvwxyz{~‹ŒŽ‘’Ō“”•–—˜Õ™›œžŸ ”¢«­®²³“µ¶·ø¹ŗ»¾ĄĮĀĆÄÅĘĒČU «¬­›œŸ ž”~uvwxyz{nopqrstUVmlkWTXYiSjZ[`\¢P2Q1/0-.+,)*'(%&#$!" ¾·ø¹µ®¶³“²ŗ»Ö !"#$%&'()**++,,--..//001122334456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwrxyz{|}x~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ”¢£¤¤„¦¦§Ø©Ŗ«¬­ ® Æ ° ± ² ³ “ µ ¶ · · ø ¹ ŗ » ¼ ½ ½ ¾ æ Ą Į Ā Ć Ä Å Ę Ē Čcopq~€ É É”šŹsessions-2008.3.24Control.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 modifyConstyHeadtyTailTyListSortNumstyListSortNums 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 tyMapKeysMapSizemapSize MapUpdate mapUpdate MapLookup mapLookup MapInsert mapInsertTyMapTM SMonadStatesgetsputSMonadIOsliftIO SMonadTranssliftSStateT runSStateTSMonad~>>~>>=sreturnSChain runSChainProgramToMVarsOutgoingT~||~sjumpssendsrecvsoffersselectrun SessionChainrunSessionChain SessionStateProgramToMVarsOutgoingprogramToMVarsOutgoing ProgramCellCell OfferImpls OfferCons OfferImplsNilBuildPidTyMapT iPidToPidmakePidrootPidmyPid CreateSession createSession BuildPidTyMap buildPidTyMapInterleavedChainrunInterleavedChainPidEq=~= InternalPidIPidPid withChannelrunInterleavedsjumpChssendChsrecvChsofferCh sselectChForkforktakedropState