{"version":3,"sources":["../src/utils.ts","../src/index.ts"],"names":["xAxis"],"mappings":"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","sourcesContent":["import { Data } from \"./types\";\n\n/** @internal */\nexport function noop() {}\n\n/** @internal */\nexport const clamp = (min: number, value: number, max: number) =>\n  Math.min(Math.max(value, min), max);\n\n/** @internal */\nexport const lngToX = (lng: number) => 0.5 + lng / 360;\n\nconst _4pi = 4 * Math.PI;\nconst rad = 180 / Math.PI;\n\n/** @internal */\nexport const latToY = (lat: number) => {\n  const sin = Math.sin(lat / rad);\n\n  return clamp(0, 0.5 - Math.log((1 + sin) / (1 - sin)) / _4pi, 1);\n};\n\n/** @internal */\nexport const boundedLngToX = (lng: number) =>\n  lngToX(((((lng + 180) % 360) + 360) % 360) - 180);\n\n/** @internal */\nexport const boundedLatToY = (lat: number) => latToY(clamp(-90, lat, 90));\n\n/** @internal */\nexport const xToLng = (x: number) => (Math.min(x, 1) - 0.5) * 360;\n\n/** @internal */\nexport const yToLat = (y: number) =>\n  2 * rad * Math.atan(Math.exp((1 - y * 2) * Math.PI)) - 90;\n\n/** @internal */\nexport const pixelsToDistance = (\n  pixels: number,\n  extent: number,\n  zoom: number\n) => pixels / (extent * Math.pow(2, zoom));\n\n/** @internal */\nexport const getMaxPossibleCount = (\n  pointsCount: number,\n  maxZoom: number,\n  minZoom: number\n) => {\n  const diff = maxZoom - minZoom;\n\n  let n = pointsCount;\n\n  for (let i = 0; i < diff; i++) {\n    n = Math.floor(n / 2);\n\n    pointsCount += n;\n  }\n\n  return pointsCount;\n};\n\n/** @internal */\nexport const getTypedArray = (max: number) =>\n  max < 256 ? Uint8Array : max < 65536 ? Uint16Array : Uint32Array;\n\n/** @internal */\nexport const getData = (\n  xAxis: Float64Array,\n  xArr: Float64Array,\n  yArr: Float64Array,\n  minZoom: number,\n  maxZoom: number,\n  radius: number,\n  extent: number,\n  dataMap: Map<number, number>,\n  _pixelsToDistance: typeof pixelsToDistance,\n  _getTypedArray: typeof getTypedArray\n): Data => {\n  const value = new Array(7);\n\n  const pointsCount = xAxis.sort().length;\n\n  const maxPossibleCount = xArr.length;\n\n  const maxPossibleClustersCount = maxPossibleCount - pointsCount;\n\n  let parentPoints = new (_getTypedArray(pointsCount))(pointsCount);\n\n  const TypedArray = _getTypedArray(maxPossibleCount);\n\n  const clustersZoom = new Uint8Array(maxPossibleClustersCount);\n  const clustersCount = new (_getTypedArray(maxPossibleClustersCount))(\n    maxPossibleClustersCount\n  );\n  const clustersFlat = new TypedArray(maxPossibleCount);\n  const clustersFlatNav = new TypedArray(maxPossibleClustersCount + 1);\n\n  const queuePoints = new TypedArray((pointsCount || 1) - 1);\n\n  const zoomSplitter = new Uint8Array(maxZoom - minZoom + 2);\n\n  let zoomSplitterIndex = 0;\n\n  let currClustersFlatIndex = 1;\n\n  for (let i = 0; i < pointsCount; i++) {\n    parentPoints[i] = dataMap.get(xAxis[i])!;\n  }\n\n  value.push(parentPoints);\n\n  const clustering = (zoom: number) => {\n    const parentPointsLength = parentPoints.length;\n\n    const nextZoomXAxis = new Float64Array(parentPointsLength);\n\n    const r = _pixelsToDistance(radius, extent, zoom);\n\n    const d = r * 2;\n\n    let nextZoomIndex = 0;\n\n    let stoppedAt = 0;\n\n    let queueIndex = 0;\n\n    const executeQueue = () => {\n      let nextQueueIndex = 0;\n\n      const currIndex = queueIndex ? queuePoints[0] : parentPoints[stoppedAt++];\n\n      let clusterSize = 1;\n\n      let trueClusterSize = 0;\n\n      let sumX = xArr[currIndex];\n      let sumY = yArr[currIndex];\n\n      const maxPossibleX = sumX + d;\n\n      const maxPossibleY = sumY + r;\n      const minPossibleY = sumY - r;\n\n      for (let i = 1; i < queueIndex; i++) {\n        const index = queuePoints[i];\n\n        const y = yArr[index];\n\n        if (y < maxPossibleY && y > minPossibleY) {\n          sumX += xArr[index];\n\n          sumY += y;\n\n          clusterSize++;\n\n          clustersFlat[currClustersFlatIndex++] = index;\n\n          trueClusterSize +=\n            ((index < pointsCount) as any) ||\n            clustersCount[index - pointsCount];\n        } else {\n          queuePoints[nextQueueIndex++] = index;\n        }\n      }\n\n      for (; stoppedAt < parentPointsLength; stoppedAt++) {\n        const index = parentPoints[stoppedAt];\n\n        const x = xArr[index];\n\n        if (x < maxPossibleX) {\n          const y = yArr[index];\n\n          if (y < maxPossibleY && y > minPossibleY) {\n            sumX += x;\n\n            sumY += y;\n\n            clusterSize++;\n\n            clustersFlat[currClustersFlatIndex++] = index;\n\n            trueClusterSize +=\n              ((index < pointsCount) as any) ||\n              clustersCount[index - pointsCount];\n          } else {\n            queuePoints[nextQueueIndex++] = index;\n          }\n        } else {\n          break;\n        }\n      }\n\n      if (trueClusterSize) {\n        sumX /= clusterSize;\n\n        while (dataMap.has(sumX)) {\n          sumX += Number.EPSILON;\n        }\n\n        const clusterIndex = dataMap.size;\n\n        const index = clusterIndex - pointsCount;\n\n        dataMap.set(sumX, clusterIndex);\n\n        xArr[clusterIndex] = sumX;\n\n        yArr[clusterIndex] = sumY / clusterSize;\n\n        clustersZoom[index] = zoom;\n\n        clustersCount[index] =\n          trueClusterSize +\n          (((currIndex < pointsCount) as any) ||\n            clustersCount[currIndex - pointsCount]);\n\n        clustersFlat[clustersFlatNav[index]] = currIndex;\n\n        clustersFlatNav[index + 1] = currClustersFlatIndex++;\n      }\n\n      nextZoomXAxis[nextZoomIndex++] = sumX;\n\n      queueIndex = nextQueueIndex;\n    };\n\n    while (stoppedAt < parentPointsLength || queueIndex > 1) {\n      executeQueue();\n    }\n\n    if (queueIndex) {\n      nextZoomXAxis[nextZoomIndex++] = xArr[queuePoints[0]];\n    }\n\n    if (nextZoomIndex < parentPointsLength) {\n      const xAxis = nextZoomXAxis.subarray(0, nextZoomIndex).sort();\n\n      parentPoints = new (_getTypedArray(dataMap.size))(nextZoomIndex);\n\n      for (let i = 0; i < nextZoomIndex; i++) {\n        parentPoints[i] = dataMap.get(xAxis[i])!;\n      }\n\n      value.push(parentPoints);\n\n      zoomSplitterIndex++;\n    } else {\n      zoomSplitter[zoomSplitterIndex]++;\n    }\n  };\n\n  for (let zoom = maxZoom; zoom >= minZoom; zoom--) {\n    clustering(zoom);\n  }\n\n  const maxIndex = dataMap.size;\n\n  const maxClustersIndex = maxIndex - pointsCount;\n\n  value[0] = xArr.subarray(0, maxIndex);\n  value[1] = yArr.subarray(0, maxIndex);\n  value[2] = clustersZoom.subarray(0, maxClustersIndex);\n  value[3] = clustersCount.subarray(0, maxClustersIndex);\n  value[4] = clustersFlat.subarray(0, currClustersFlatIndex);\n  value[5] = clustersFlatNav.subarray(0, maxClustersIndex + 1);\n  value[6] = zoomSplitter.subarray(0, zoomSplitterIndex + 1);\n\n  return value as any;\n};\n","import {\n  ClusterMapper,\n  Coords,\n  Data,\n  MarkerClusterOptions,\n  MarkerMapper,\n  UintArray,\n} from \"./types\";\nimport {\n  clamp,\n  pixelsToDistance,\n  boundedLatToY,\n  boundedLngToX,\n  latToY,\n  lngToX,\n  yToLat,\n  xToLng,\n  getData,\n  getMaxPossibleCount,\n  getTypedArray,\n  noop,\n} from \"./utils\";\n\nexport type { MarkerClusterOptions, Coords, MarkerMapper, ClusterMapper };\n\nclass MarkerCluster<T> {\n  /** The points from the last executed {@link MarkerCluster.loadAsync loadAsync} or {@link MarkerCluster.load load} method */\n  points?: T[];\n  /** Indicates whether a loading operation is currently in progress */\n  isLoading = false;\n  /** method from {@link MarkerClusterOptions.callback options}, you can use it to update ui after calling {@link MarkerCluster.setZoom setZoom} and/or {@link MarkerCluster.setBounds setBounds}  */\n  callback: () => void;\n  /**\n   * [Worker](https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker) instance, inits at first {@link MarkerCluster.loadAsync loadAsync} call\n   */\n  static worker?: Worker;\n\n  /**\n   * If {@link MarkerCluster.loadAsync loadAsync} was called, use this method to abandon {@link MarkerCluster.worker worker} if it needed\n   */\n  static cleanup: () => void = noop;\n\n  /**\n   * @param getLngLat - function to get the latitude and longitude coordinates of a marker\n   * @param options - options for configuring the clustering\n   */\n  constructor(\n    getLngLat: (item: T) => Coords,\n    options: MarkerClusterOptions = {}\n  ) {\n    this._getLngLat = getLngLat;\n    this._minZoom = options.minZoom || 0;\n    this._maxZoom = (options.maxZoom as any) >= 0 ? options.maxZoom! : 16;\n    this._radius = options.radius || 60;\n    this._extent = options.extent || 256;\n    this.callback = options.callback || noop;\n  }\n\n  /**\n   * Loads the given points and clusters them for each zoom level from {@link MarkerClusterOptions.maxZoom maxZoom} to {@link MarkerClusterOptions.minZoom minZoom}\n   * @param points - The points to be clustered\n   */\n  load = (points: T[]) => {\n    this.isLoading = true;\n\n    const dataMap = new Map<number, number>();\n\n    const args: any[] = this._getDataArgs(\n      points,\n      dataMap.has.bind(dataMap),\n      dataMap.set.bind(dataMap)\n    );\n\n    args.push(dataMap, pixelsToDistance, getTypedArray);\n\n    this._setStore(points, getData.apply(null, args));\n\n    this.isLoading = false;\n\n    this.callback();\n\n    return this;\n  };\n\n  /**\n   * Loads the given points and asynchronously clusters them for each zoom level from {@link MarkerClusterOptions.maxZoom maxZoom} to {@link MarkerClusterOptions.minZoom minZoom}\n   * @see {@link MarkerCluster.cleanup cleanup}\n   * @description this method use [Worker](https://developer.mozilla.org/en-US/docs/Web/API/Worker/Worker) and fallbacks to {@link MarkerCluster.load load} if {@link MarkerCluster.worker worker} initializing was failed\n   */\n  loadAsync = (points: T[]) =>\n    new Promise<this>((resolve) => {\n      this.isLoading = true;\n\n      let worker: Worker;\n\n      try {\n        worker = MarkerCluster._getWorker();\n      } catch (err) {\n        return resolve(this.load(points));\n      }\n\n      const dataSet = new Set<number>();\n\n      const args: any[] = this._getDataArgs(\n        points,\n        dataSet.has.bind(dataSet),\n        dataSet.add.bind(dataSet)\n      );\n\n      const id = \"randomUUID\" in crypto ? crypto.randomUUID() : Math.random();\n\n      const listener = (e: MessageEvent) => {\n        const data = e.data;\n\n        if (data.pop() == id) {\n          worker.removeEventListener(\"message\", listener);\n\n          this._setStore(points, data);\n\n          this.isLoading = false;\n\n          this.callback();\n\n          resolve(this);\n        }\n      };\n\n      worker.addEventListener(\"message\", listener);\n\n      args.push(id);\n\n      worker.postMessage(args, [\n        args[0].buffer,\n        args[1].buffer,\n        args[2].buffer,\n      ]);\n    });\n\n  /**\n   * Sets current zoom level for {@link MarkerCluster.getPoints getPoints} method\n   */\n  setZoom = (zoom: number) => {\n    this._zoom = zoom;\n\n    return this;\n  };\n\n  /**\n   * Sets current bounds for {@link MarkerCluster.getPoints getPoints} method\n   * @param westLng - west longitude boundary\n   * @param southLat - south latitude boundary\n   * @param eastLng - east longitude boundary\n   * @param northLat - north latitude boundary\n   */\n  setBounds = (\n    westLng: number,\n    southLat: number,\n    eastLng: number,\n    northLat: number\n  ) => {\n    this._bounds = [westLng, southLat, eastLng, northLat];\n\n    return this;\n  };\n\n  /**\n   * @param expand - for values in range `(0..1)` considered as percentage, otherwise as absolute pixels value to expand given {@link MarkerCluster.setBounds bounds}\n   * @returns array of mapped clusters and points for the given {@link MarkerCluster.setZoom zoom} and {@link MarkerCluster.setBounds bounds}\n   */\n  getPoints = <M, C>(\n    markerMapper: MarkerMapper<T, M>,\n    clusterMapper: ClusterMapper<C>,\n    expand?: number\n  ) => {\n    const points = this.points;\n\n    const zoom = this._zoom;\n\n    const bounds = this._bounds;\n\n    const value: (M | C)[] = [];\n\n    if (points && bounds && zoom >= 0) {\n      const ids = this._store.get(\n        clamp(this._minZoom, Math.round(zoom), this._maxZoom + 1)\n      )!;\n\n      let minX = bounds[0];\n      let maxY = boundedLatToY(bounds[1]);\n      let maxX = bounds[2];\n      let minY = boundedLatToY(bounds[3]);\n\n      const mutate = this._getPointsMutator(\n        markerMapper,\n        clusterMapper,\n        value.push.bind(value)\n      );\n\n      let expandX: number;\n\n      if (expand) {\n        const expandY =\n          Math.abs(expand) < 1\n            ? (maxY - minY) * expand\n            : (expandX = pixelsToDistance(expand, this._extent, zoom));\n\n        minY = clamp(0, minY - expandY, 1);\n        maxY = clamp(0, maxY + expandY, 1);\n      }\n\n      if (maxX - minX < 360) {\n        minX = boundedLngToX(minX);\n        maxX = maxX == 180 ? 1 : boundedLngToX(maxX);\n\n        if (minX >= maxX) {\n          this._mutatePoints(mutate, ids, 0, minY, maxX, maxY);\n          this._mutatePoints(mutate, ids, minX, minY, 1, maxY);\n\n          return value;\n        }\n\n        if (expand) {\n          expandX ||= Math.abs(maxX - minX) * expand;\n\n          minX = clamp(0, minX - expandX, 1);\n          maxX = clamp(0, maxX + expandX, 1);\n        }\n      } else {\n        minX = 0;\n        maxX = 1;\n      }\n\n      this._mutatePoints(mutate, ids, minX, minY, maxX, maxY);\n    }\n\n    return value;\n  };\n\n  /**\n   * @returns array with mapped children of cluster\n   */\n  getChildren = <M, C>(\n    clusterId: number,\n    markerMapper: MarkerMapper<T, M>,\n    clusterMapper: ClusterMapper<C>\n  ) => {\n    const points = this.points;\n\n    const children: (M | C)[] = [];\n\n    if (points) {\n      const mutate = this._getPointsMutator(\n        markerMapper,\n        clusterMapper,\n        children.push.bind(children)\n      );\n\n      const end = this._clustersFlatNav[clusterId + 1];\n\n      const clustersFlat = this._clustersFlat;\n\n      for (let i = this._clustersFlatNav[clusterId]; i < end; i++) {\n        mutate(clustersFlat[i]);\n      }\n    }\n\n    return children;\n  };\n\n  private readonly _getLngLat: (item: T) => Coords;\n  private readonly _minZoom: number;\n  private readonly _maxZoom: number;\n  private readonly _radius: number;\n  private readonly _extent: number;\n\n  private _store: Map<number, UintArray>;\n\n  private _xArr: Float64Array;\n  private _yArr: Float64Array;\n  private _clustersZoom: Uint8Array;\n  private _clustersCount: UintArray;\n  private _clustersFlat: UintArray;\n  private _clustersFlatNav: UintArray;\n\n  private _zoom = -1;\n  private _bounds?: [\n    westLng: number,\n    southLat: number,\n    eastLng: number,\n    northLat: number\n  ];\n\n  private static _getWorker() {\n    if (!MarkerCluster.worker) {\n      const objectUrl = URL.createObjectURL(\n        new Blob(\n          [\n            `o=${getData.toString()};p=${pixelsToDistance.toString()};l=${getTypedArray.toString()};self.onmessage=function(n){for(var e=n.data,a=e.pop(),f=new Map,s=e[0],t=s.length,u=0;u<t;u++)f.set(s[u],u);e.push(f,p,l);var r=o.apply(null,e),c=r.map(function(n){return n.buffer});r.push(a),self.postMessage(r,c)}`,\n          ],\n          { type: \"application/javascript\" }\n        )\n      );\n\n      const worker = new Worker(objectUrl);\n\n      MarkerCluster.worker = worker;\n\n      MarkerCluster.cleanup = function () {\n        MarkerCluster.cleanup = noop;\n\n        worker.terminate();\n\n        URL.revokeObjectURL(objectUrl);\n\n        MarkerCluster.worker = undefined;\n      };\n    }\n\n    return MarkerCluster.worker;\n  }\n\n  private _getDataArgs(\n    points: T[],\n    has: (Map<number, number> | Set<number>)[\"has\"],\n    add: Map<number, number>[\"set\"] | Set<number>[\"add\"]\n  ) {\n    const maxZoom = this._maxZoom;\n    const minZoom = this._minZoom;\n\n    const getLngLat = this._getLngLat;\n\n    const pointsCount = points.length;\n\n    const xAxis = new Float64Array(pointsCount);\n\n    const maxPossibleCount = getMaxPossibleCount(pointsCount, maxZoom, minZoom);\n\n    const xArr = new Float64Array(maxPossibleCount);\n\n    const yArr = new Float64Array(maxPossibleCount);\n\n    for (let i = 0; i < pointsCount; i++) {\n      const coords = getLngLat(points[i]);\n\n      let x = lngToX(coords[0]);\n\n      while (has(x)) {\n        x += Number.EPSILON;\n      }\n\n      add(x, i);\n\n      xArr[i] = x;\n\n      xAxis[i] = x;\n\n      yArr[i] = latToY(coords[1]);\n    }\n\n    return [xAxis, xArr, yArr, minZoom, maxZoom, this._radius, this._extent];\n  }\n\n  private _setStore(points: T[], data: Data) {\n    this.points = points;\n\n    this._xArr = data[0];\n    this._yArr = data[1];\n    this._clustersZoom = data[2];\n    this._clustersCount = data[3];\n    this._clustersFlat = data[4];\n    this._clustersFlatNav = data[5];\n\n    const zoomSplitter = data[6];\n\n    const store = (this._store = new Map<number, UintArray>());\n\n    for (let i = zoomSplitter.length, zoom = this._minZoom; i--; ) {\n      for (let j = zoomSplitter[i]; j >= 0; j--) {\n        store.set(zoom++, data[7 + i] as UintArray);\n      }\n    }\n  }\n\n  private _getPointsMutator<M, C>(\n    markerMapper: MarkerMapper<T, M>,\n    clusterMapper: ClusterMapper<C>,\n    push: Array<M | C>[\"push\"]\n  ) {\n    const xArr = this._xArr;\n\n    const yArr = this._yArr;\n\n    const points = this.points!;\n\n    const clustersCount = this._clustersCount;\n\n    const clustersZoom = this._clustersZoom;\n\n    const pointsCount = points.length;\n\n    return (index: number) => {\n      const x = xArr[index];\n\n      push(\n        index < pointsCount\n          ? markerMapper(points[index], x)\n          : clusterMapper(\n              xToLng(x),\n              yToLat(yArr[index]),\n              clustersCount[(index -= pointsCount)],\n              clustersZoom[index] + 1,\n              x,\n              index\n            )\n      );\n    };\n  }\n\n  private _mutatePoints(\n    mutate: (index: number) => void,\n    ids: UintArray,\n    minX: number,\n    minY: number,\n    maxX: number,\n    maxY: number\n  ) {\n    const xArr = this._xArr;\n\n    const yArr = this._yArr;\n\n    const l = ids.length - 1;\n\n    let start = 0;\n    let end = l;\n\n    const fn = (x: number) => {\n      const middle = Math.floor((start + end) / 2);\n\n      if (x < xArr[ids[middle]]) {\n        end = middle - 1;\n      } else {\n        start = middle + 1;\n      }\n    };\n\n    while (xArr[ids[start]] < minX) {\n      fn(minX);\n    }\n\n    end = l;\n\n    let startIndex = start;\n\n    while (xArr[ids[end]] > maxX) {\n      fn(maxX);\n    }\n\n    for (++end; startIndex < end; startIndex++) {\n      const index = ids[startIndex];\n\n      const y = yArr[index];\n\n      if (y > minY && y < maxY) {\n        mutate(index);\n      }\n    }\n  }\n}\n\nexport default MarkerCluster;\n"]}