`module OTProduct (X : Sig.ORDERED_TYPE) (Y : Sig.ORDERED_TYPE) : Sig.ORDERED_TYPE with type t = X.t * Y.t`

Cartesian product of two ordered types.

`module HTProduct (X : Sig.HASHABLE) (Y : Sig.HASHABLE) : Sig.HASHABLE with type t = X.t * Y.t`

Cartesian product of two hashable types.

`module CMPProduct (X : Sig.COMPARABLE) (Y : Sig.COMPARABLE) : Sig.COMPARABLE with type t = X.t * Y.t`

Cartesian product of two comparable types.

`module DataV (L : sig ... end) (V : Sig.COMPARABLE) : sig ... end`

Create a vertex type with some data attached to it

`module Memo (X : Sig.HASHABLE) : sig ... end`