This module is useful to deal with sets of genomic regions. It
provides set operations like union, intersection, difference or
membership tests. Specific data types are also provided when the
regions are annotated with some value.

Genomic regions are represented as a pair formed by a range and an
abstract representation of a sequence/chromosome identifier. The
data structures implemented here are parameterized over this
abstract type. To obtain an implementation for the most common case
where chromosomes are identified with a string, simply apply the
functor Make on the String module.

The functor Make provides four datatypes, which corresponds to
variants where:

of_stream f ls builds a signal from a collection of
annotated locations. f is used when two locations intersect, to
compute the annotation on their intersection. *Beware*, f
should be associative and commutative since when many locations
in ls intersect, there is no guarantee on the order followed to
aggregate them and their annotation.

closest lset loc returns the location in lset that is the
closest to loc, along with the actual (minimal)
distance. Returns None if there is no location in lset
that comes from the same chromosome than loc.

closest lmap loc returns the location in lmap that is the
closest to loc, along with its annotation and the actual (minimal)
distance. Returns None if there is no location in lmap
that comes from the same chromosome than loc.