sig
  module type DISPOSABLE =
    sig
      type t
      val equal : Disposal.DISPOSABLE.t -> Disposal.DISPOSABLE.t -> bool
      val hash : Disposal.DISPOSABLE.t -> int
      val default : Disposal.DISPOSABLE.t -> unit
    end
  module type DISPOSAL =
    sig
      type data
      val register :
        (Disposal.DISPOSAL.data -> unit) ->
        Disposal.DISPOSAL.data -> Disposal.DISPOSAL.data
      val manage :
        ?disposer:(Disposal.DISPOSAL.data -> unit) ->
        Disposal.DISPOSAL.data -> Disposal.DISPOSAL.data
      val dispose : Disposal.DISPOSAL.data -> unit
    end
  module Make :
    functor (D : DISPOSABLE->
      sig
        type data = D.t
        val register : (data -> unit) -> data -> data
        val manage : ?disposer:(data -> unit) -> data -> data
        val dispose : data -> unit
      end
end