sig
  module Make :
    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
end