Source: simplify.js

import { check } from "./helpers/check.js";
import { topology } from "topojson-server";
import { feature, quantize as quantiz } from "topojson-client";
import { presimplify, quantile, simplify as simple } from "topojson-simplify";

const topojson = Object.assign(
  {},
  { topology, presimplify, quantiz, quantile, simple, feature }
);

/**
 * @function simplify
 * @export
 * @summary Simplify geometries. The `simplify()` function allows to simplify a geometry using <code>topojson-simplify</code> library. The parameter k difine the  The quantile of the simplification. By default, the generalization level is calculated automatically to ensure smooth map display.
 * @description Based on `topojson.simplify`.
 * @param {object|array} data - A GeoJSON FeatureCollection, an array of features, an array of geometries, a single feature or a single geometry.
 * @param {object} options - Optional parameters
 * @param {number} [options.k = undefined] - quantile of the simplification (from 0 to 1). If not defened, the generalization level is calculated automatically to ensure smooth map display.
 * @param {number} [options.quantize = undefined] - A smaller quantizeAmount produces a smaller file. Typical values are between 1e4 and 1e6, although it depends on the resolution you want in the output file.
 * @param {number} [options.arcs = 15000] - Instead of the k parameter, you can determine the level of generalization by targeting a specific number of arcs. The result will be an approximation.
 * @returns {object|array} - A GeoJSON FeatureCollection, an array of features, an array of geometries, a single feature or a single geometry (it depends on what you've set as `data`).
 * @example
 * geotoolbox.simplify(*a geojson*, {k: 0.1})
 */

export function simplify(
  data,
  { k = undefined, quantize = undefined, arcs = 15000 } = {}
) {
  const handle = check(data);
  let x = handle.import(data);
  let topo = topojson.topology({ foo: x });
  let simpl = topojson.presimplify(topo);

  if (k == undefined) {
    k = arcs / simpl.arcs.flat().length;
    k = k > 1 ? 1 : k;
  }

  simpl = topojson.simple(simpl, topojson.quantile(simpl, k));
  if (quantize) {
    simpl = topojson.quantiz(simpl, quantize);
  }

  x.features = topojson.feature(simpl, Object.keys(simpl.objects)[0]).features;
  x.name = "simplify";
  return handle.export(x);
}