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