sig
  type id = string
  module type Job =
    sig
      type input
      type key
      type inter
      type output
      val name : MapReduce.id
      val map :
        MapReduce.Job.input ->
        (MapReduce.Job.key * MapReduce.Job.inter) list Async.Std.Deferred.t
      val reduce :
        MapReduce.Job.key * MapReduce.Job.inter list ->
        MapReduce.Job.output Async.Std.Deferred.t
    end
  val register_job : (module MapReduce.Job-> unit
  val get_job : MapReduce.id -> (module MapReduce.Job) option
  val list_jobs : unit -> MapReduce.id list
  module type Controller =
    functor (Job : Job->
      sig
        val map_reduce :
          MapReduce.Job.input list ->
          (MapReduce.Job.key * MapReduce.Job.output) list
          Async.Std.Deferred.t
      end
  module type EntryPoint =
    sig val main : string list -> unit Async.Std.Deferred.t end
  module type App =
    sig
      val name : MapReduce.id
      module Make : functor (C : Controller-> EntryPoint
    end
  val register_app : (module MapReduce.App-> unit
  val get_app : MapReduce.id -> (module MapReduce.App) option
  val list_apps : unit -> MapReduce.id list
end