`Fix.Numbering`

This module offers a facility for **assigning a unique number** to each value in a certain finite set and translating (both ways) between values and their numbers.

The functor `Make`

requires an implementation of maps for the type `M.key`

and offers a two-phase numbering facility. The function `encode`

is backed by a map, therefore runs in logarithmic time or constant time, depending on the type of map that is used. The function `decode`

is backed by an array of size `n`

, therefore runs in constant time.

`module ForOrderedType (T : sig ... end) : sig ... end`

`ForOrderedType`

is a special case of `Make`

where it suffices for keys to be ordered.

`module ForHashedType (T : sig ... end) : sig ... end`

`ForHashedType`

is a special case of `Make`

where it suffices for keys to be hashed.