The extensible-data package

Extensible lists: Add to a list at compile-time in many modules, which
do not necessarily know each other, and then collect it into a single
list in a module depending on all of them (possibly indirectly).

Extensible products: It is a record in which new fields can be added
anywhere including in different modules; dependent defaults are
supported, so it is still possible to make a value of such a type.

Extensible sums: Type with choices; new choices can be added anywhere
including in other modules (which do not need to know each other). The
operations on them are also freely extensible in the similar way.

Extensible trees: You can make a tree out of types, and have a value at
each node. New nodes can be added anywhere if you have access to the
node which will become the new node's parent.