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