2t+PP      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNO*PMConvert a type-level number to an Int. Of course, we can only go this way... QRSTUVWXYZ[\]^_`abc  PQRSTUVW\]  PQQRSTUUVWW\]]    dIndex or update a list efghFind the length of a list. ijk defghijk defefghiijjkk*lmnopqrstuvwx !"#$%&'()*+,-.y/012345*lmnopqrstuvwx !"#$%&'()*+,-.y/012345*lmmnoopqrstuvvwwxx &%$#"!!"#$%&'-,+*)(()*+,-.yy/0123456789:;<=>?@AAn extension of the typical Monad such that you track additional  from and to- parameters. Thus you can think of this like z{  where the type of the z{ varies. ABCDEF6789:;<=>?@ABCDEF678789::;<<=>?>?@ABCABCDEFEF|=The representation of a computation that performs work using D session types. Again, really quite similar to a more-parameterized  State monad. }~G@Use OfferImpls to construct the implementations of the branches  of an offer. Really, it's just a slightly fancy list. HJAPerform 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. KASend a value to the other party. Of course, the value must be of 1 the correct type indicated in the session type. L9Recieve 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. MAOffer a number of branches. This is basically an external choice  - the other party uses N! 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. NSelect which branch we'(re taking at a branch point. Use a type  number (!Control.Concurrent.Session.Number) to indicate the branch  to take. O=Run! Provide a program and a start point within that program A (which also then means that all implementations must start with  J7), the two implementations which must be duals of each E other, run them, have them communicate, wait until they both finish 8 and die and then return the results from both of them. |}~GHIJKLMNO |}~}~GHHJKLMNOP  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPGHIJMNKLO.'-,+*)( &%$#"!0/12345  DEF@ABC=>?;<9:678           !"#$%&'"()*+,-./01234567789:;<==>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcddefghij(klmklmnnoppqrsstutvwxyzsessions-2008.2.22Control.Concurrent.Session!Control.Concurrent.Session.NumberControl.Concurrent.Session.List&Control.Concurrent.Session.SessionType!Control.Concurrent.Session.SMonad"Control.Concurrent.Session.RuntimeD9D8D7D6D5D4D3D2D1D0EConsNilnilconsSWellFormedConfigDualdualOfferSelectJumpRecv RecvDoubleRecvStrRecvCharRecvBoolRecvIntSend SendDoubleSendStrSendCharSendBoolSendIntEndendjumpselectoffer~>~|~testWellformed SMonadStatesgetsputSMonadIOsliftIO SMonadTranssliftSStateT runSStateTSMonad~>>~>>=sreturnSChain runSChain OfferImpls OfferImplsNil~||~sjumpssendsrecvsoffersselectrunTypeNumberToInt tyNumToIntTyNum SmallerThanAddtyAddPredtyPredStripLeadingZerostyStripLeadingZerosDecrementRightToLefttyDecrementRightToLeftSucctySuccIncrementRightToLefttyIncrementRightToLeftReverse' tyReverse'Reverse tyReverseElem tyListElem tyListUpdateTyList ListLength listLength OnlyOutgoing onlyOutgoingChoiceSNoJumpsBeyondSValidSessionType STerminal SNonTerminalSListOfSessionTypes SListOfJumps mtl-1.1.1.0Control.Monad.State.LazyState SessionChainrunSessionChain SessionStateProgramToMVarsOutgoingprogramToMVarsOutgoing ProgramCellCell SelectCellWalkOfferImplswalkOfferImpls OfferConscarefullySwapToNextCell