module type Gen =sig..end
type 'a t 
type 'a bound 
val create : 'a bound ->
       'a bound -> 'a tcreate l u returns the interval with lower bound l and upper bound u, unless
      l > u, in which case create returns the empty interval.val empty : 'a tval intersect : 'a t -> 'a t -> 'a tval is_empty : 'a t -> boolval is_empty_or_singleton : 'a t -> boolval bounds : 'a t ->
       ('a bound * 'a bound) optionval lbound : 'a t -> 'a bound optionval ubound : 'a t -> 'a bound optionval bounds_exn : 'a t ->
       'a bound * 'a boundval lbound_exn : 'a t -> 'a boundval ubound_exn : 'a t -> 'a boundval contains : 'a t -> 'a bound -> boolval compare_value : 'a t ->
       'a bound ->
       [ `Above | `Below | `Interval_is_empty | `Within ]val bound : 'a t ->
       'a bound -> 'a bound optionbound t x returns None iff is_empty t.  If bounds t = Some (a, b), then
      bound returns Some y where y is the element of t closest to x.  I.e.:
      |  y = a  if x < a
      |  y = x  if a <= x <= b
      |  y = b  if x > b
val is_superset : 'a t -> of_:'a t -> boolis_superset i1 of_:i2 is whether i1 contains i2.  The empty interval is
      contained in every interval.val is_subset : 'a t -> of_:'a t -> boolval map : 'a t ->
       f:('a bound -> 'b bound) ->
       'b tmap t ~f returns create (f l) (f u) if bounds t = Some (l, u), and empty if
      t is empty.  Note that if f l > f u, the result of map is empty, by the
      definition of create.val are_disjoint : 'a t list -> boolval are_disjoint_as_open_intervals : 'a t list -> boolval list_intersect : 'a t list ->
       'a t list -> 'a t listilist1 and ilist2 are lists of (disjoint) intervals,
      list_intersect ilist1 ilist2 returns the list of disjoint intervals that correspond
      to the intersection of ilist1 with ilist2.val half_open_intervals_are_a_partition : 'a t list -> bool