functor (R : Reagents.S->
  sig
    module Counter :
      sig
        type t
        type ('a, 'b) reagent = ('a, 'b) R.t
        val create : int -> t
        val get : t -> (unit, int) reagent
        val inc : t -> (unit, int) reagent
        val dec : t -> (unit, int) reagent
        val try_dec : t -> (unit, int option) reagent
      end
    module Treiber_stack :
      sig
        type 'a t
        type ('a, 'b) reagent = ('a, 'b) R.t
        val create : unit -> 'a t
        val push : 'a t -> ('a, unit) reagent
        val pop : 'a t -> (unit, 'a) reagent
        val try_pop : 'a t -> (unit, 'a option) reagent
      end
    module Elimination_stack :
      sig
        type 'a t
        type ('a, 'b) reagent = ('a, 'b) R.t
        val create : unit -> 'a t
        val push : 'a t -> ('a, unit) reagent
        val pop : 'a t -> (unit, 'a) reagent
        val try_pop : 'a t -> (unit, 'a option) reagent
      end
    module MichaelScott_queue :
      sig
        type 'a t
        type ('a, 'b) reagent = ('a, 'b) R.t
        val create : unit -> 'a t
        val push : 'a t -> ('a, unit) reagent
        val pop : 'a t -> (unit, 'a) reagent
        val try_pop : 'a t -> (unit, 'a option) reagent
      end
  end