functor (R : Reagents.S->
  sig
    module Countdown_latch :
      sig
        type t
        type ('a, 'b) reagent = ('a, 'b) R.t
        val create : int -> t
        val get_count : t -> (unit, int) reagent
        val await : t -> (unit, unit) reagent
        val count_down : t -> (unit, unit) reagent
      end
    module Exchanger :
      sig
        type 'a t
        type ('a, 'b) reagent = ('a, 'b) R.t
        val create : ?name:string -> unit -> 'a t
        val exchange : 'a t -> ('a, 'a) reagent
      end
    module Lock :
      sig
        type ('a, 'b) reagent = ('a, 'b) R.t
        type t
        val create : unit -> t
        val acq : t -> (unit, unit) reagent
        val rel : t -> (unit, bool) reagent
        val try_acq : t -> (unit, bool) reagent
      end
    module Recursive_lock :
      functor (Tid : sig val get_tid : unit -> int end->
        sig
          type ('a, 'b) reagent = ('a, 'b) R.t
          type t
          val create : unit -> t
          val acq : t -> (unit, unit) reagent
          val rel : t -> (unit, bool) reagent
          val try_acq : t -> (unit, bool) reagent
        end
    module Condition_variable :
      sig
        type ('a, 'b) reagent = ('a, 'b) R.t
        type lock = Lock.t
        type t
        val create : unit -> t
        val wait : lock -> t -> bool
        val signal : t -> unit
        val broadcast : t -> unit
      end
  end