ordered-set.ts 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  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. export const indexOf: <T extends number = number>(set: OrderedSet<T>, x: T) => number = Base.indexOf as any;
  19. export const getAt: <T extends number = number>(set: OrderedSet<T>, i: number) => T = Base.getAt as any;
  20. export const min: <T extends number = number>(set: OrderedSet<T>) => T = Base.min as any;
  21. export const max: <T extends number = number>(set: OrderedSet<T>) => T = Base.max as any;
  22. export const start: <T extends number = number>(set: OrderedSet<T>) => T = Base.start as any;
  23. export const end: <T extends number = number>(set: OrderedSet<T>) => T = Base.end as any;
  24. export const size: <T extends number = number>(set: OrderedSet<T>) => number = Base.size as any;
  25. export const hashCode: <T extends number = number>(set: OrderedSet<T>) => number = Base.hashCode as any;
  26. export const areEqual: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => boolean = Base.areEqual as any;
  27. export const areIntersecting: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => boolean = Base.areIntersecting as any;
  28. /** Check if the 2nd argument is a subset of the 1st */
  29. export const isSubset: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => boolean = Base.isSubset as any;
  30. export const union: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => OrderedSet<T> = Base.union as any;
  31. export const intersect: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => OrderedSet<T> = Base.intersect as any;
  32. export const subtract: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => OrderedSet<T> = Base.subtract as any;
  33. export const findPredecessorIndex: <T extends number = number>(set: OrderedSet<T>, x: number) => number = Base.findPredecessorIndex as any;
  34. export const findPredecessorIndexInInterval: <T extends number = number>(set: OrderedSet<T>, x: T, range: Interval) => number = Base.findPredecessorIndexInInterval as any;
  35. export const findRange: <T extends number = number>(set: OrderedSet<T>, min: T, max: T) => Interval = Base.findRange as any;
  36. export const intersectionSize: <T extends number = number>(a: OrderedSet<T>, b: OrderedSet<T>) => number = Base.intersectionSize as any;
  37. export function forEach<T extends number, Ctx>(set: OrderedSet<T>, f: (v: T, i: number, ctx: Ctx) => void, ctx?: Ctx): Ctx {
  38. return Base.forEach(set as any, f as any, ctx);
  39. }
  40. export function isInterval<T extends number = number>(set: OrderedSet<T>): set is Interval<T> {
  41. return Interval.is(set);
  42. }
  43. export function isSortedArray<T extends number = number>(set: OrderedSet<T>): set is SortedArray<T> {
  44. return !Interval.is(set);
  45. }
  46. export function toArray<T extends number = number>(set: OrderedSet<T>): T[] {
  47. const array: T[] = []
  48. OrderedSet.forEach(set, v => array.push(v))
  49. return array
  50. }
  51. }
  52. /** Represents bla */
  53. type OrderedSet<T extends number = number> = SortedArray<T> | Interval<T>
  54. export default OrderedSet