functor (P : sig type t end->
  sig
    type param = P.t
    type result = P.t
    val extend : (param -> result) -> unit
    val extend_once : (param -> result) -> unit
    val apply : param -> result
    val is_empty : unit -> bool
    val clear : unit -> unit
    val length : unit -> int
  end