interval.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /**
  2. * Copyright (c) 2017 mol* contributors, licensed under MIT, See LICENSE file for more info.
  3. *
  4. * @author David Sehnal <david.sehnal@gmail.com>
  5. */
  6. import * as Impl from './impl/interval';
  7. namespace Interval {
  8. export const Empty: Interval = Impl.Empty as any;
  9. export const ofSingleton: <T extends number = number>(value: T) => Interval<T> = (v) => Impl.ofRange(v, v) as any;
  10. /** Create interval from range [min, max] */
  11. export const ofRange: <T extends number = number>(min: T, max: T) => Interval<T> = Impl.ofRange as any;
  12. /** Create interval from bounds [start, end), i.e. [start, end - 1] */
  13. export const ofBounds: <T extends number = number>(start: T, end: T) => Interval<T> = Impl.ofBounds as any;
  14. /** Create interval from length [0, length), i.e. [0, length - 1] */
  15. export const ofLength: <T extends number = number>(length: T) => Interval<T> = Impl.ofLength as any;
  16. export const is: <T extends number = number>(v: any) => v is Interval<T> = Impl.is as any;
  17. /** Test if a value is within the bounds of the interval */
  18. export const has: <T extends number = number>(interval: Interval<T>, x: T) => boolean = Impl.has as any;
  19. /** Returns the index of `x` in `set` or -1 if not found. */
  20. export const indexOf: <T extends number = number>(interval: Interval<T>, x: T) => number = Impl.indexOf as any;
  21. export const getAt: <T extends number = number>(interval: Interval<T>, i: number) => T = Impl.getAt as any;
  22. /** Start value of the Interval<T>, same as min value */
  23. export const start: <T extends number = number>(interval: Interval<T>) => T = Impl.start as any;
  24. /** End value of the Interval<T>, same as max + 1 */
  25. export const end: <T extends number = number>(interval: Interval<T>) => T = Impl.end as any;
  26. /** Min value of the Interval<T>, same as start value */
  27. export const min: <T extends number = number>(interval: Interval<T>) => T = Impl.min as any;
  28. /** Max value of the Interval<T>, same as end - 1 */
  29. export const max: <T extends number = number>(interval: Interval<T>) => T = Impl.max as any;
  30. /** Number of values in the interval */
  31. export const size: <T extends number = number>(interval: Interval<T>) => number = Impl.size as any;
  32. /** Hash code describing the interval */
  33. export const hashCode: <T extends number = number>(interval: Interval<T>) => number = Impl.hashCode as any;
  34. /** String representation of the interval */
  35. export const toString: <T extends number = number>(interval: Interval<T>) => string = Impl.toString as any;
  36. /** Test if two intervals are identical */
  37. export const areEqual: <T extends number = number>(a: Interval<T>, b: Interval<T>) => boolean = Impl.areEqual as any;
  38. /** Test if two intervals are intersecting, i.e. their bounds overlap */
  39. export const areIntersecting: <T extends number = number>(a: Interval<T>, b: Interval<T>) => boolean = Impl.areIntersecting as any;
  40. /** Test if interval b is fully included in interval a */
  41. export const isSubInterval: <T extends number = number>(a: Interval<T>, b: Interval<T>) => boolean = Impl.isSubInterval as any;
  42. export const findPredecessorIndex: <T extends number = number>(interval: Interval<T>, x: T) => number = Impl.findPredecessorIndex as any;
  43. export const findPredecessorIndexInInterval: <T extends number = number>(interval: Interval<T>, x: T, bounds: Interval) => number = Impl.findPredecessorIndexInInterval as any;
  44. export const findRange: <T extends number = number>(interval: Interval<T>, min: T, max: T) => Interval = Impl.findRange as any;
  45. /** Size of the intersection of the two intervals */
  46. export const intersectionSize: <T extends number = number>(a: Interval<T>, b: Interval<T>) => number = Impl.intersectionSize as any;
  47. /** Get a new interval that is the intersection of the two intervals */
  48. export const intersect: <T extends number = number>(a: Interval<T>, b: Interval<T>) => Interval<T> = Impl.intersect as any;
  49. }
  50. /** Interval describing a range [min, max] of values */
  51. interface Interval<T extends number = number> { '@type': 'int-interval' }
  52. export default Interval;