sig
  module type S =
    sig
      type param
      type result
      val extend : (Hook.S.param -> Hook.S.result) -> unit
      val apply : Hook.S.param -> Hook.S.result
      val is_empty : unit -> bool
      val clear : unit -> unit
      val length : unit -> int
    end
  module type Iter_hook =
    sig
      type param
      type result = unit
      val extend : (param -> result) -> unit
      val apply : param -> result
      val is_empty : unit -> bool
      val clear : unit -> unit
      val length : unit -> int
    end
  module Build :
    functor (P : sig type t end->
      sig
        type param = P.t
        type result = unit
        val extend : (param -> result) -> unit
        val apply : param -> result
        val is_empty : unit -> bool
        val clear : unit -> unit
        val length : unit -> int
      end
  module Make :
    functor (X : sig  end->
      sig
        type param = unit
        type result = unit
        val extend : (param -> result) -> unit
        val apply : param -> result
        val is_empty : unit -> bool
        val clear : unit -> unit
        val length : unit -> int
      end
  module Fold :
    functor (P : sig type t end->
      sig
        type param = P.t
        type result = P.t
        val extend : (param -> result) -> unit
        val apply : param -> result
        val is_empty : unit -> bool
        val clear : unit -> unit
        val length : unit -> int
      end
end