package core_unix
Unix-specific portions of Core
Install
Dune Dependency
Authors
Maintainers
Sources
v0.17.1.tar.gz
md5=9370dca36f518fcea046d2752e3de22b
sha512=c4e8ce9d5885ac8fa8d554a97e1857f3a1c933e0eb5dfd4fe874412b9d09e6d0a2973b644733855553f33f5c859719228f0e6aaf3a2b7eb5befb46fc513750de
doc/src/core_unix.interval_lib/interval_intf.ml.html
Source file interval_intf.ml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371
open! Core module type Gen = sig type 'a t (** [bound] is the type of points in the interval (and therefore of the bounds). [bound] is instantiated in two different ways below: in [module type S] as a monotype and in [module type S1] as ['a]. *) type 'a bound (** [create l u] returns the interval with lower bound [l] and upper bound [u], unless [l > u], in which case it returns the empty interval. *) val create : 'a bound -> 'a bound -> 'a t val empty : 'a t val intersect : 'a t -> 'a t -> 'a t val is_empty : 'a t -> bool val is_empty_or_singleton : 'a t -> bool (*_ If you are looking for a simple interval type where the bounds are not optional, consider Min_max_pair.t. *) val bounds : 'a t -> ('a bound * 'a bound) option val lbound : 'a t -> 'a bound option val ubound : 'a t -> 'a bound option val bounds_exn : 'a t -> 'a bound * 'a bound val lbound_exn : 'a t -> 'a bound val ubound_exn : 'a t -> 'a bound (** [convex_hull ts] returns an interval whose upper bound is the greatest upper bound of the intervals in the list, and whose lower bound is the least lower bound of the list. Suppose you had three intervals [a], [b], and [c]: {v a: ( ) b: ( ) c: ( ) hull: ( ) v} In this case the hull goes from [lbound_exn a] to [ubound_exn c]. *) val convex_hull : 'a t list -> 'a t val contains : 'a t -> 'a bound -> bool val compare_value : 'a t -> 'a bound -> [ `Below | `Within | `Above | `Interval_is_empty ] (** [bound 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.: {v y = a if x < a y = x if a <= x <= b y = b if x > b v} *) val bound : 'a t -> 'a bound -> 'a bound option (** [is_superset i1 of_:i2] is whether i1 contains i2. The empty interval is contained in every interval. *) val is_superset : 'a t -> of_:'a t -> bool val is_subset : 'a t -> of_:'a t -> bool (** [map 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]. If you think of an interval as a set of points, rather than a pair of its bounds, then [map] is not the same as the usual mathematical notion of mapping [f] over that set. For example, [map ~f:(fun x -> x * x)] maps the interval [[-1,1]] to [[1,1]], not to [[0,1]]. *) val map : 'a t -> f:('a bound -> 'b bound) -> 'b t (** [are_disjoint ts] returns [true] iff the intervals in [ts] are pairwise disjoint. *) val are_disjoint : 'a t list -> bool (** Returns true iff a given set of intervals would be disjoint if considered as open intervals, e.g., [(3,4)] and [(4,5)] would count as disjoint according to this function. *) val are_disjoint_as_open_intervals : 'a t list -> bool (** Assuming that [ilist1] and [ilist2] are lists of disjoint intervals, [list_intersect ilist1 ilist2] considers the intersection [(intersect i1 i2)] of every pair of intervals [(i1, i2)], with [i1] drawn from [ilist1] and [i2] from [ilist2], returning just the non-empty intersections. By construction these intervals will be disjoint, too. For example: {[ let i = Interval.create;; list_intersect [i 4 7; i 9 15] [i 2 4; i 5 10; i 14 20];; [(4, 4), (5, 7), (9, 10), (14, 15)] ]} Raises an exception if either input list is non-disjoint. *) val list_intersect : 'a t list -> 'a t list -> 'a t list (** Returns true if the intervals, when considered as half-open intervals, nestle up cleanly one to the next. I.e., if you sort the intervals by the lower bound, then the upper bound of the [n]th interval is equal to the lower bound of the [n+1]th interval. The intervals do not need to partition the entire space, they just need to partition their union. *) val half_open_intervals_are_a_partition : 'a t list -> bool end module type Gen_set = sig type 'a t type 'a bound (** An interval set is a set of nonempty disjoint intervals. *) type 'a interval (** [create_exn] creates an interval set containing intervals whose lower and upper bounds are given by the pairs passed to the function. Raises if the pairs overlap. *) val create_exn : ('a bound * 'a bound) list -> 'a t (** [create_from_intervals_exn] creates an interval set. Empty intervals are dropped. Raises if the nonempty intervals are not disjoint. *) val create_from_intervals_exn : 'a interval list -> 'a t val contains : 'a t -> 'a bound -> bool (** [contains_set] returns true iff for every interval in the contained set, there exists an interval in the container set that is its superset. *) val contains_set : container:'a t -> contained:'a t -> bool (** The largest and smallest element of the interval set, respectively. Raises Invalid_argument on empty sets. *) val ubound_exn : 'a t -> 'a bound val lbound_exn : 'a t -> 'a bound val ubound : 'a t -> 'a bound option val lbound : 'a t -> 'a bound option (** [inter t1 t2] computes the intersection of sets [t1] and [t2]. [O(length t1 * length t2)]. *) val inter : 'a t -> 'a t -> 'a t (** [union t1 t2] computes the union of sets [t1] and [t2]. [O((length t1 + length t2) * log(length t1 + length t2))]. *) val union : 'a t -> 'a t -> 'a t (** [union_list l] computes the union of a list of sets. [O(sum length * log(sum length))]. *) val union_list : 'a t list -> 'a t end module type S = sig type t [@@deriving bin_io, sexp, compare, hash] type bound include Gen with type 'a t := t with type 'a bound := bound (** @inline *) (** [create] has the same type as in [Gen], but adding it here prevents a type-checker issue with nongeneralizable type variables. *) val create : bound -> bound -> t type 'a poly_t val to_poly : t -> bound poly_t type 'a poly_set module Set : sig type t [@@deriving bin_io, sexp] include Gen_set with type 'a t := t with type 'a bound := bound (** @inline *) val to_poly : t -> bound poly_set (** [to_list] will return a list of non-overlapping intervals defining the set, in ascending order. *) val to_list : t -> bound interval list end with type 'a interval := t end module type S1 = sig (** This type [t] supports bin-io and sexp conversion by way of the [[@@deriving bin_io, sexp]] extensions, which inline the relevant function signatures (like [bin_read_t] and [t_of_sexp]). *) type 'a t [@@deriving bin_io, sexp, compare, hash] include Gen with type 'a t := 'a t with type 'a bound := 'a (** @inline *) module Set : sig type 'a t [@@deriving bin_io, sexp] include Gen_set with type 'a t := 'a t with type 'a bound := 'a (** @inline *) end with type 'a interval := 'a t end module type S_stable = sig type t [@@deriving sexp_grammar] include Stable_with_witness with type t := t end (** Module for simple closed intervals over arbitrary types. Used by calling the {{!module:Core.Interval.Make}[Make]} functor with a type that satisfies {{!module:Base.Comparable}[Comparable]} (for correctly ordering elements). Note that the actual interface for intervals is in {{!modtype:Core__.Interval_intf.Gen}[Interval_intf.Gen]}, following a Core pattern of defining an interface once in a [Gen] module, then reusing it across monomorphic ([S]) and polymorphic ([S1], [S2], ... [SN]) variants, where [SN] denotes a signature of N parameters. Here, [S1] is included in this module because the signature of one ['a] parameter is the default. See the documentation of {{!module:Core.Interval.Make}[Interval.Make]} for a more detailed usage example. *) module type Interval = sig (** {2 Intervals using polymorphic compare} This part of the interface is for polymorphic intervals, which are well ordered by polymorphic compare. Using this with types that are not (like sets) will lead to crazy results. *) include S1 (** @inline *) (** {2 Type-specialized intervals} The module type [S] is used to define signatures for intervals over a specific type, like [Interval.Ofday] (whose bounds are [Time.Ofday.t]) or [Interval.Float], whose bounds are floats. Note the heavy use of destructive substitution, which removes the redefined type or module from the signature. This allows for clean type constraints in codebases, like Core's, where there are lots of types going by the same name (e.g., "t"). *) (** {3 Signatures } The following signatures are used for specifying the types of the type-specialized intervals. *) module type S1 = S1 module type S = S with type 'a poly_t := 'a t with type 'a poly_set := 'a Set.t module type S_time = sig end [@@deprecated "[since 2021-08] Use [Interval_unix]"] (** {3 Specialized interval types} *) module Ofday : S with type bound = Time_float.Ofday.t and type t = Time_float.Ofday.t t module Ofday_ns : S with type bound = Time_ns.Ofday.t and type t = Time_ns.Ofday.t t module Time : sig end [@@deprecated "[since 2021-08] Use [Interval_unix]"] module Time_ns : sig end [@@deprecated "[since 2021-08] Use [Interval_unix]"] module Float : S with type bound = Float.t and type t = Float.t t module Int : sig include S with type bound = Int.t (** @open *) include Container.S0 with type t := t with type elt := bound include Binary_searchable.S with type t := t with type elt := bound (**/**) (*_ See the Jane Street Style Guide for an explanation of [Private] submodules: https://opensource.janestreet.com/standards/#private-submodules *) module Private : sig val get : t -> int -> int end end (** [Interval.Make] is a functor that takes a type that you'd like to create intervals for and returns a module with functions over intervals of that type. For example, suppose you had a [Percent.t] type and wanted to work with intervals over it, i.e., inclusive ranges like 40-50% or 0-100%. You would create your [Percent_interval] module by calling: {[module Percent_interval = Interval.Make(Percent)]} You now have a module with lots of functionality ready to use. For instance you could call [Percent_interval.empty] to create an empty interval, or: {[Percent_interval.create (Percent.of_percentage 3) (Percent.of_percentage 30)]} to get an actual interval that ranges from [3%] to [30%]. You can then ask questions of this interval, like whether it's a {{!val:is_subset} subset} of another interval or whether it {!val:contains} a particular value. NB. In order to use the [Interval.Make] functor, your type must satisfy Comparable and support bin-io and s-expression conversion. At a minimum, then, [Percent] must look like this: {[ module Percent = struct module T = struct type t = float [@@deriving bin_io, compare, sexp] end include T include Comparable.Make_binable(T) end ]} *) module Make (Bound : sig type t [@@deriving bin_io, sexp, hash] include Comparable.S with type t := t end) : S with type bound = Bound.t and type t = Bound.t t (** [Stable] is used to build stable protocols. It ensures backwards compatibility by checking the sexp and bin-io representations of a given module. Here it's also applied to the [Float], [Int], [Time], [Time_ns], and [Ofday] intervals. *) module Stable : sig module V1 : sig type nonrec 'a t = 'a t [@@deriving bin_io, compare, hash, sexp, sexp_grammar, stable_witness] module Float : S_stable with type t = Float.t module Int : S_stable with type t = Int.t module Time : sig end [@@deprecated "[since 2021-08] Use [Interval_unix]"] module Time_ns : sig end [@@deprecated "[since 2021-08] Use [Interval_unix]"] module Ofday : S_stable with type t = Ofday.t module Ofday_ns : S_stable with type t = Ofday_ns.t (**/**) (*_ See the Jane Street Style Guide for an explanation of [Private] submodules: https://opensource.janestreet.com/standards/#private-submodules *) module Private : sig type 'a interval := 'a t type 'a t = | Interval of 'a * 'a | Empty [@@deriving compare, variants] val to_float : float t -> Float.t val to_int : int t -> Int.t val to_ofday : Core.Time_float.Ofday.t t -> Ofday.t (** Used in testing Interval_unix.Time.t. Using Core.Time.t interval is fine because it is equal to Interval_unix.Time.t. *) val to_time : Core.Time_float.t t -> Core.Time_float.t interval end end end (**/**) (*_ See the Jane Street Style Guide for an explanation of [Private] submodules: https://opensource.janestreet.com/standards/#private-submodules *) module Private : sig module Make (Bound : sig type t [@@deriving bin_io, sexp, hash] include Comparable.S with type t := t end) : S with type bound = Bound.t and type t = Bound.t t end end
sectionYPositions = computeSectionYPositions($el), 10)"
x-init="setTimeout(() => sectionYPositions = computeSectionYPositions($el), 10)"
>