sig
  module type Computation =
    sig
      type input
      type key
      type value
      type output
      val compare_keys :
        MapReduce.Computation.key -> MapReduce.Computation.key -> int
      val map :
        MapReduce.Computation.input ->
        (MapReduce.Computation.key * MapReduce.Computation.value) list
      val combine :
        MapReduce.Computation.key ->
        MapReduce.Computation.value ->
        MapReduce.Computation.value -> MapReduce.Computation.value
      val reduce :
        MapReduce.Computation.key ->
        MapReduce.Computation.value ->
        MapReduce.Computation.output -> MapReduce.Computation.output
    end
  module type S =
    sig
      type input
      type output
      val compute :
        ThreadPoolExecutor.t ->
        MapReduce.S.input Stream.t ->
        MapReduce.S.output -> MapReduce.S.output
    end
  module Make :
    functor (C : Computation->
      sig
        type input = C.input
        type output = C.output
        val compute :
          ThreadPoolExecutor.t -> input Stream.t -> output -> output
      end
end