sig
  type ('t0, 't1, 'a) t
  val return : '-> ('t0, 't0, 'm) Session.Monadic.t
  val ( >>= ) :
    ('t0, 't1, 'a) Session.Monadic.t ->
    ('-> ('t1, 't2, 'b) Session.Monadic.t) ->
    ('t0, 't2, 'b) Session.Monadic.t
  val ( >>> ) :
    ('t0, 't1, 'a) Session.Monadic.t ->
    ('t1, 't2, 'b) Session.Monadic.t -> ('t0, 't2, 'b) Session.Monadic.t
  val fix :
    (('t0, 't1, 'a) Session.Monadic.t -> ('t0, 't1, 'a) Session.Monadic.t) ->
    ('t0, 't1, 'a) Session.Monadic.t
  val connect :
    (('a, 'b) Session.st, Session.et, unit) Session.Monadic.t ->
    (('b, 'a) Session.st, Session.et, 'm) Session.Monadic.t -> 'm
  val receive :
    (('m * ('a, 'b) Session.st) Session.it, ('a, 'b) Session.st, 'm)
    Session.Monadic.t
  val send :
    '->
    (('m * ('b, 'a) Session.st) Session.ot, ('a, 'b) Session.st, unit)
    Session.Monadic.t
  val branch :
    ('t0, 't2, 'a) Session.Monadic.t ->
    ('t1, 't2, 'a) Session.Monadic.t ->
    (('t0, 't1) Session.choice Session.it, 't2, 'a) Session.Monadic.t
  val select_true :
    ((('b, 'a) Session.st, ('d, 'c) Session.st) Session.choice Session.ot,
     ('a, 'b) Session.st, unit)
    Session.Monadic.t
  val select_false :
    ((('b, 'a) Session.st, ('d, 'c) Session.st) Session.choice Session.ot,
     ('c, 'd) Session.st, unit)
    Session.Monadic.t
end