functor
  (Types : sig
             type send_request
             type receive_request = send_request list
             val to_string : send_request -> string
           end->
  sig
    module Set :
      sig
        type elt = Types.send_request
        type t = Generic_request_handler.MakeRequest(Types).Set.t
        val empty : t
        val is_empty : t -> bool
        val mem : t -> elt -> bool
        val add : t -> elt -> t
        val singleton : elt -> t
        val remove : t -> elt -> t
        val cardinal : t -> int
        val union : t -> t -> t
        val intersectp : t -> t -> bool
        val iter : (elt -> unit) -> t -> unit
        val mem_filt : t -> elt list -> elt list
        val fst_mem_filt : t -> (elt * 'a) list -> (elt * 'a) list
        val not_mem_filt : t -> elt list -> elt list
        val of_sorted_list : elt list -> t
        val of_list : elt list -> t
        val to_list : t -> elt list
        val elements : t -> elt list
        val inter : t -> t -> t
        val diff : t -> t -> t
        val compare : t -> t -> int
        val equal : t -> t -> bool
        val subset : t -> t -> bool
        val is_subset : t -> t -> bool
        val fold : ('-> elt -> 'a) -> '-> t -> 'a
        val range_fold : (elt -> int) -> ('-> elt -> 'a) -> '-> t -> 'a
        val for_all : (elt -> bool) -> t -> bool
        val exists : (elt -> bool) -> t -> bool
        val filter : (elt -> bool) -> t -> t
        val partition : (elt -> bool) -> t -> t * t
        val min_elt : t -> elt
        val max_elt : t -> elt
        val choose : t -> elt
        val add_list : t -> elt list -> t
        val subtract_list : t -> elt list -> t
      end
    type req = Set.t * Set.t * Set.t
    type send_req = Types.send_request
    type receive_req = Types.receive_request
    val empty : Set.t * Set.t * Set.t
    val merge_send_request :
      Set.t * Set.t * Set.t -> Set.elt -> Set.t * Set.t * Set.t
    val merge_receive_request :
      Set.t * Set.t * Set.t -> Set.elt list -> Set.t * Set.t * Set.t
    val match_requests :
      Set.t * Set.t * Set.t ->
      (Set.elt * Set.elt list) option * (Set.t * Set.t * Set.t)
  end