sig
  type 'a io
  type chan_endpoint
  type ('a, 'b) session constraint 'a = [>  ] constraint 'b = [>  ]
  type ('a, 'b, 'c) process
  val send :
    '->
    (unit,
     ([ `Send of 'a * ([>  ] as 'b) ], [ `Recv of 'a * ([>  ] as 'c) ])
     Binary_session.Binary_process.session,
     ('b, 'c) Binary_session.Binary_process.session)
    Binary_session.Binary_process.process
  val recv :
    unit ->
    ('a,
     ([ `Recv of 'a * ([>  ] as 'b) ], [ `Send of 'a * ([>  ] as 'c) ])
     Binary_session.Binary_process.session,
     ('b, 'c) Binary_session.Binary_process.session)
    Binary_session.Binary_process.process
  val offer :
    ('e, ([>  ] as 'a, [>  ] as 'b) Binary_session.Binary_process.session,
     'f)
    Binary_session.Binary_process.process ->
    ('e, ([>  ] as 'c, [>  ] as 'd) Binary_session.Binary_process.session,
     'f)
    Binary_session.Binary_process.process ->
    ('e,
     ([ `Offer of
          ('a, 'b) Binary_session.Binary_process.session *
          ('c, 'd) Binary_session.Binary_process.session ],
      [ `Choice of
          ('b, 'a) Binary_session.Binary_process.session *
          ('d, 'c) Binary_session.Binary_process.session ])
     Binary_session.Binary_process.session, 'f)
    Binary_session.Binary_process.process
  val choose_left :
    ('e, ([>  ] as 'a, [>  ] as 'b) Binary_session.Binary_process.session,
     'f)
    Binary_session.Binary_process.process ->
    ('e,
     ([ `Choice of
          ('a, 'b) Binary_session.Binary_process.session *
          ([>  ] as 'c, [>  ] as 'd) Binary_session.Binary_process.session ],
      [ `Offer of
          ('b, 'a) Binary_session.Binary_process.session *
          ('d, 'c) Binary_session.Binary_process.session ])
     Binary_session.Binary_process.session, 'f)
    Binary_session.Binary_process.process
  val choose_right :
    ('e, ([>  ] as 'a, [>  ] as 'b) Binary_session.Binary_process.session,
     'f)
    Binary_session.Binary_process.process ->
    ('e,
     ([ `Choice of
          ([>  ] as 'c, [>  ] as 'd) Binary_session.Binary_process.session *
          ('a, 'b) Binary_session.Binary_process.session ],
      [ `Offer of
          ('d, 'c) Binary_session.Binary_process.session *
          ('b, 'a) Binary_session.Binary_process.session ])
     Binary_session.Binary_process.session, 'f)
    Binary_session.Binary_process.process
  val stop :
    '->
    ('a, ([ `Stop ], [ `Stop ]) Binary_session.Binary_process.session, unit)
    Binary_session.Binary_process.process
  val lift_io :
    'Binary_session.Binary_process.io ->
    ('a, 'b, 'b) Binary_session.Binary_process.process
  val return : '-> ('a, 'b, 'b) Binary_session.Binary_process.process
  val ( >>= ) :
    ('a, 'b, 'c) Binary_session.Binary_process.process ->
    ('-> ('d, 'c, 'e) Binary_session.Binary_process.process) ->
    ('d, 'b, 'e) Binary_session.Binary_process.process
  val run_processes :
    ('a, ([>  ] as 'b, [>  ] as 'c) Binary_session.Binary_process.session,
     unit)
    Binary_session.Binary_process.process ->
    ('d, ('c, 'b) Binary_session.Binary_process.session, unit)
    Binary_session.Binary_process.process ->
    ((unit -> 'Binary_session.Binary_process.io) *
     (unit -> 'Binary_session.Binary_process.io))
    Binary_session.Binary_process.io
end