sig
  type ('a, 'b) t
  val never : ('a, 'b) Reagents.S.t
  val constant : 'a -> ('b, 'a) Reagents.S.t
  val post_commit : ('a -> unit) -> ('a, 'a) Reagents.S.t
  val lift : ('a -> 'b) -> ('a, 'b) Reagents.S.t
  val lift_blocking : ('a -> 'b option) -> ('a, 'b) Reagents.S.t
  val return : ('a -> (unit, 'b) Reagents.S.t) -> ('a, 'b) Reagents.S.t
  val ( >>= ) :
    ('a, 'b) Reagents.S.t ->
    ('b -> (unit, 'c) Reagents.S.t) -> ('a, 'c) Reagents.S.t
  val ( >>> ) :
    ('a, 'b) Reagents.S.t -> ('b, 'c) Reagents.S.t -> ('a, 'c) Reagents.S.t
  val ( <+> ) :
    ('a, 'b) Reagents.S.t -> ('a, 'b) Reagents.S.t -> ('a, 'b) Reagents.S.t
  val ( <*> ) :
    ('a, 'b) Reagents.S.t ->
    ('a, 'c) Reagents.S.t -> ('a, 'b * 'c) Reagents.S.t
  val attempt : ('a, 'b) Reagents.S.t -> ('a, 'b option) Reagents.S.t
  val run : ('a, 'b) Reagents.S.t -> 'a -> 'b
  module Ref :
    sig
      type 'a ref
      type ('a, 'b) reagent = ('a, 'b) t
      val mk_ref : 'a -> 'a ref
      val read : 'a ref -> (unit, 'a) reagent
      val read_imm : 'a ref -> 'a
      val cas : 'a ref -> 'a -> 'a -> (unit, unit) reagent
      val cas_imm : 'a ref -> 'a -> 'a -> bool
      val upd : 'a ref -> ('a -> 'b -> ('a * 'c) option) -> ('b, 'c) reagent
    end
  module Channel :
    sig
      type ('a, 'b) endpoint
      type ('a, 'b) reagent = ('a, 'b) t
      val mk_chan :
        ?name:string -> unit -> ('a, 'b) endpoint * ('b, 'a) endpoint
      val swap : ('a, 'b) endpoint -> ('a, 'b) reagent
    end
end