sig
  module type Problem =
    sig
      val identifier : string
      type init
      type client_data
      type input
      type key
      type value
      type output
      val init_client :
        JoinMapRed.Problem.init -> JoinMapRed.Problem.client_data
      val compare_keys :
        JoinMapRed.Problem.key -> JoinMapRed.Problem.key -> int
      val map :
        JoinMapRed.Problem.client_data ->
        JoinMapRed.Problem.input ->
        (JoinMapRed.Problem.key * JoinMapRed.Problem.value) list
      val combine :
        JoinMapRed.Problem.value ->
        JoinMapRed.Problem.value -> JoinMapRed.Problem.value
      val reduce :
        JoinMapRed.Problem.key ->
        JoinMapRed.Problem.value ->
        JoinMapRed.Problem.output -> JoinMapRed.Problem.output
    end
  module type S =
    sig
      type init
      type input
      type output
      val client : JoinHelper.configuration -> unit
      val server :
        JoinHelper.configuration ->
        JoinMapRed.S.init ->
        ('a, JoinMapRed.S.input) JoinPool.Simple.enum ->
        JoinMapRed.S.output -> JoinMapRed.S.output
    end
  module Make :
    functor (P : Problem->
      sig
        type init = P.init
        type input = P.input
        type output = P.output
        val client : JoinHelper.configuration -> unit
        val server :
          JoinHelper.configuration ->
          init -> ('a, input) JoinPool.Simple.enum -> output -> output
      end
end