# Module type Pool_intf.Pool

    module type Pool = sig .. end

    module type S = Pool_intf.S

    include Pool_intf.Pool.S

This uses an `Obj_array.t` to implement the pool. We expose that `Pointer.t` is an `int` so that OCaml can avoid the write barrier, due to knowing that `Pointer.t` isn't an OCaml pointer.

    module Unsafe: sig .. end

An `Unsafe` pool is like an ordinary pool, except that the `create` function does not require an initial element.

    module Debug: functor (Pool : S) -> sig .. end

`Debug` builds a pool in which every function can run `invariant` on its pool argument(s) and/or print a debug message to stderr, as determined by `!check_invariant` and `!show_messages`, which are initially both `true`.

    module Error_check: functor (Pool : S) -> S

`Error_check` builds a pool that has additional error checking for pointers, in particular to detect using a `free`d pointer or multiply `free`ing a pointer.