sig
  type 'a t
  type 'a bound
  val create :
    'Interval_intf.Gen.bound ->
    'Interval_intf.Gen.bound -> 'Interval_intf.Gen.t
  val empty : 'Interval_intf.Gen.t
  val intersect :
    'Interval_intf.Gen.t ->
    'Interval_intf.Gen.t -> 'Interval_intf.Gen.t
  val is_empty : 'Interval_intf.Gen.t -> bool
  val is_empty_or_singleton : 'Interval_intf.Gen.t -> bool
  val bounds :
    'Interval_intf.Gen.t ->
    ('Interval_intf.Gen.bound * 'Interval_intf.Gen.bound) option
  val lbound : 'Interval_intf.Gen.t -> 'Interval_intf.Gen.bound option
  val ubound : 'Interval_intf.Gen.t -> 'Interval_intf.Gen.bound option
  val bounds_exn :
    'Interval_intf.Gen.t ->
    'Interval_intf.Gen.bound * 'Interval_intf.Gen.bound
  val lbound_exn : 'Interval_intf.Gen.t -> 'Interval_intf.Gen.bound
  val ubound_exn : 'Interval_intf.Gen.t -> 'Interval_intf.Gen.bound
  val contains : 'Interval_intf.Gen.t -> 'Interval_intf.Gen.bound -> bool
  val compare_value :
    'Interval_intf.Gen.t ->
    'Interval_intf.Gen.bound ->
    [ `Above | `Below | `Interval_is_empty | `Within ]
  val bound :
    'Interval_intf.Gen.t ->
    'Interval_intf.Gen.bound -> 'Interval_intf.Gen.bound option
  val is_superset :
    'Interval_intf.Gen.t -> of_:'Interval_intf.Gen.t -> bool
  val is_subset :
    'Interval_intf.Gen.t -> of_:'Interval_intf.Gen.t -> bool
  val map :
    'Interval_intf.Gen.t ->
    f:('Interval_intf.Gen.bound -> 'Interval_intf.Gen.bound) ->
    'Interval_intf.Gen.t
  val are_disjoint : 'Interval_intf.Gen.t list -> bool
  val are_disjoint_as_open_intervals : 'Interval_intf.Gen.t list -> bool
  val list_intersect :
    'Interval_intf.Gen.t list ->
    'Interval_intf.Gen.t list -> 'Interval_intf.Gen.t list
  val half_open_intervals_are_a_partition :
    'Interval_intf.Gen.t list -> bool
end