functor (P : sig module Id : Comparable type t end->
  sig
    type param = P.t
    type result = unit
    val apply : param -> result
    val is_empty : unit -> bool
    val clear : unit -> unit
    val length : unit -> int
    type key = P.Id.t
    type id
    val register_key : key -> id
    val extend : id -> (param -> result) -> unit
    val extend_once : id -> (param -> result) -> unit
    val add_dependency : id -> id -> unit
  end