sig
  val create :
    ?name:string -> unit -> ('a, 'b) Session.st * ('b, 'a) Session.st
  val close : Session.et -> unit
  val send :
    '-> ('m * ('a, 'b) Session.st) Session.ot -> ('b, 'a) Session.st
  val receive :
    ('m * ('a, 'b) Session.st) Session.it -> 'm * ('a, 'b) Session.st
  val select :
    (('a, 'b) Session.st -> 'm) -> 'Session.ot -> ('b, 'a) Session.st
  val select_true :
    [> `True of ('a, 'b) Session.st ] Session.ot -> ('b, 'a) Session.st
  val select_false :
    [> `False of ('a, 'b) Session.st ] Session.ot -> ('b, 'a) Session.st
  val branch : ([>  ] as 'm) Session.it -> 'm
  val is_valid : ('a, 'b) Session.st -> bool
  val acquire : ('a, 'b) Session.st -> ('a, 'b) Session.st
  val try_acquire : ('a, 'b) Session.st -> ('a, 'b) Session.st option
  val same_session : ('a, 'b) Session.st -> ('c, 'd) Session.st -> bool
  val string_of_endpoint : ('a, 'b) Session.st -> string
  val ( @= ) :
    (('a, 'b) Session.st -> 'm * Session.et) ->
    ((('a, 'b) Session.st, ('c, 'd) Session.st) Session.seq,
     (('b, 'a) Session.st, ('d, 'c) Session.st) Session.seq)
    Session.st -> 'm * ('c, 'd) Session.st
  val ( @> ) :
    (('a, 'b) Session.st -> Session.et) ->
    ((('a, 'b) Session.st, ('c, 'd) Session.st) Session.seq,
     (('b, 'a) Session.st, ('d, 'c) Session.st) Session.seq)
    Session.st -> ('c, 'd) Session.st
end