ordered-set.ts 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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 Base from './impl/ordered-set'
  7. import Interval from './interval'
  8. import SortedArray from './sorted-array';
  9. /** test */
  10. namespace OrderedSet {
  11. export const Empty: OrderedSet = Base.Empty as any;
  12. export const ofSingleton: <T extends number = number>(value: T) => OrderedSet<T> = Base.ofSingleton as any;
  13. export const ofRange: <T extends number = number>(min: T, max: T) => OrderedSet<T> = Base.ofRange as any;
  14. export const ofBounds: <T extends number = number>(min: T, max: T) => OrderedSet<T> = Base.ofBounds as any;
  15. /** It is the responsibility of the caller to ensure the array is sorted and contains unique values. */
  16. export const ofSortedArray: <T extends number = number>(xs: ArrayLike<T>) => OrderedSet<T> = Base.ofSortedArray as any;
  17. export const has: <T extends number = number>(set: OrderedSet<T>, x: T) => boolean = Base.has as any;
  18. /** Returns the index of `x` in `set` or -1 if not found. */
  19. export const indexOf: <T extends number = number>(set: OrderedSet<T>, x: T) => number = Base.indexOf as any;
  20. export const getAt: <T extends number = number>(set: OrderedSet<T>, i: number) => T = Base.getAt as any;
  21. export const min: <T extends number = number>(set: OrderedSet<T>) => T = Base.min as any;
  22. export const max: <T extends number = number>(set: OrderedSet<T>) => T = Base.max as any;
  23. export const start: <T extends number = number>(set: OrderedSet<T>) => T = Base.start as any;
  24. export const end: <T extends number = number>(set: OrderedSet<T>) => T = Base.end as any;
  25. export const size: <T extends number = number>(set: OrderedSet<T>) => number = Base.size as any;
  26. export const hashCode: <T extends number = number>(set: OrderedSet<T>) => number = Base.hashCode as any;
  27. export const areEqual: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => boolean = Base.areEqual as any;
  28. export const areIntersecting: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => boolean = Base.areIntersecting as any;
  29. /** Check if the 2nd argument is a subset of the 1st */
  30. export const isSubset: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => boolean = Base.isSubset as any;
  31. export const union: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => OrderedSet<T> = Base.union as any;
  32. export const intersect: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => OrderedSet<T> = Base.intersect as any;
  33. export const subtract: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => OrderedSet<T> = Base.subtract as any;
  34. export const findPredecessorIndex: <T extends number = number>(set: OrderedSet<T>, x: number) => number = Base.findPredecessorIndex as any;
  35. export const findPredecessorIndexInInterval: <T extends number = number>(set: OrderedSet<T>, x: T, range: Interval) => number = Base.findPredecessorIndexInInterval as any;
  36. export const findRange: <T extends number = number>(set: OrderedSet<T>, min: T, max: T) => Interval = Base.findRange as any;
  37. export const intersectionSize: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => number = Base.intersectionSize as any;
  38. export function forEach<T extends number, Ctx>(set: OrderedSet<T>, f: (v: T, i: number, ctx: Ctx) => void, ctx?: Ctx): Ctx {
  39. return Base.forEach(set as any, f as any, ctx);
  40. }
  41. export function isInterval<T extends number = number>(set: OrderedSet<T>): set is Interval<T> {
  42. return Interval.is(set);
  43. }
  44. export function isSortedArray<T extends number = number>(set: OrderedSet<T>): set is SortedArray<T> {
  45. return !Interval.is(set);
  46. }
  47. export function toArray<T extends number = number>(set: OrderedSet<T>): T[] {
  48. const array: T[] = []
  49. OrderedSet.forEach(set, v => array.push(v))
  50. return array
  51. }
  52. }
  53. /** Represents bla */
  54. type OrderedSet<T extends number = number> = SortedArray<T> | Interval<T>
  55. export default OrderedSet