@visactor/vutils 1.0.24 → 1.0.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.zh-CN.md +12 -0
- package/REGRESSION.md +36 -0
- package/cjs/angle.d.ts +61 -0
- package/cjs/angle.js +73 -7
- package/cjs/angle.js.map +1 -1
- package/cjs/color/Color.d.ts +3 -0
- package/cjs/color/Color.js +64 -10
- package/cjs/color/Color.js.map +1 -1
- package/cjs/color/hexToRgb.d.ts +5 -0
- package/cjs/color/hexToRgb.js +5 -0
- package/cjs/color/hexToRgb.js.map +1 -1
- package/cjs/color/rgbToHsl.js +5 -1
- package/cjs/color/rgbToHsl.js.map +1 -1
- package/cjs/common/array.d.ts +43 -0
- package/cjs/common/array.js +44 -0
- package/cjs/common/array.js.map +1 -1
- package/cjs/common/bisect.d.ts +21 -0
- package/cjs/common/bisect.js +29 -0
- package/cjs/common/bisect.js.map +1 -1
- package/cjs/common/bootstrap.d.ts +5 -0
- package/cjs/common/bootstrap.js +22 -0
- package/cjs/common/bootstrap.js.map +1 -0
- package/cjs/common/clone.js +6 -0
- package/cjs/common/clone.js.map +1 -1
- package/cjs/common/cloneDeep.js +4 -1
- package/cjs/common/cloneDeep.js.map +1 -1
- package/cjs/common/correlation.d.ts +3 -0
- package/cjs/common/correlation.js +83 -0
- package/cjs/common/correlation.js.map +1 -0
- package/cjs/common/debounce.js +22 -4
- package/cjs/common/debounce.js.map +1 -1
- package/cjs/common/deviation.js +1 -2
- package/cjs/common/ecdf.d.ts +8 -0
- package/cjs/common/ecdf.js +11 -2
- package/cjs/common/ecdf.js.map +1 -1
- package/cjs/common/extent.d.ts +4 -0
- package/cjs/common/extent.js +4 -2
- package/cjs/common/extent.js.map +1 -1
- package/cjs/common/field.d.ts +6 -0
- package/cjs/common/field.js +3 -0
- package/cjs/common/field.js.map +1 -1
- package/cjs/common/has.d.ts +17 -0
- package/cjs/common/has.js +18 -1
- package/cjs/common/has.js.map +1 -1
- package/cjs/common/index.d.ts +5 -0
- package/cjs/common/index.js +34 -6
- package/cjs/common/index.js.map +1 -1
- package/cjs/common/interpolate.js +16 -3
- package/cjs/common/interpolate.js.map +1 -1
- package/cjs/common/isBase64.d.ts +6 -0
- package/cjs/common/isBase64.js +6 -0
- package/cjs/common/isBase64.js.map +1 -1
- package/cjs/common/isBoolean.d.ts +13 -0
- package/cjs/common/isBoolean.js +13 -1
- package/cjs/common/isBoolean.js.map +1 -1
- package/cjs/common/isEmpty.js +11 -1
- package/cjs/common/isEmpty.js.map +1 -1
- package/cjs/common/isEqual.js +19 -7
- package/cjs/common/isEqual.js.map +1 -1
- package/cjs/common/isFunction.d.ts +25 -0
- package/cjs/common/isFunction.js +27 -2
- package/cjs/common/isFunction.js.map +1 -1
- package/cjs/common/isNull.js +2 -1
- package/cjs/common/isNumber.d.ts +23 -0
- package/cjs/common/isNumber.js +23 -1
- package/cjs/common/isNumber.js.map +1 -1
- package/cjs/common/isNumeric.d.ts +25 -0
- package/cjs/common/isNumeric.js +25 -0
- package/cjs/common/isNumeric.js.map +1 -1
- package/cjs/common/isObject.d.ts +21 -0
- package/cjs/common/isObject.js +22 -0
- package/cjs/common/isObject.js.map +1 -1
- package/cjs/common/isObjectLike.d.ts +20 -0
- package/cjs/common/isObjectLike.js +21 -0
- package/cjs/common/isObjectLike.js.map +1 -1
- package/cjs/common/isPlainObject.d.ts +25 -0
- package/cjs/common/isPlainObject.js.map +1 -1
- package/cjs/common/isPrototype.js +1 -1
- package/cjs/common/isRegExp.js +1 -1
- package/cjs/common/isShallowEqual.js +1 -0
- package/cjs/common/isShallowEqual.js.map +1 -1
- package/cjs/common/isString.d.ts +13 -0
- package/cjs/common/isString.js +13 -1
- package/cjs/common/isString.js.map +1 -1
- package/cjs/common/isType.d.ts +6 -0
- package/cjs/common/isType.js +6 -0
- package/cjs/common/isType.js.map +1 -1
- package/cjs/common/isValidNumber.js.map +1 -1
- package/cjs/common/isValidUrl.js.map +1 -1
- package/cjs/common/kde.d.ts +28 -0
- package/cjs/common/kde.js +29 -5
- package/cjs/common/kde.js.map +1 -1
- package/cjs/common/mean.d.ts +2 -0
- package/cjs/common/mean.js +25 -0
- package/cjs/common/mean.js.map +1 -0
- package/cjs/common/merge.js +20 -4
- package/cjs/common/merge.js.map +1 -1
- package/cjs/common/mixin.js +14 -3
- package/cjs/common/mixin.js.map +1 -1
- package/cjs/common/normalQuantile.d.ts +5 -0
- package/cjs/common/normalQuantile.js +21 -0
- package/cjs/common/normalQuantile.js.map +1 -0
- package/cjs/common/number.d.ts +24 -0
- package/cjs/common/number.js +24 -1
- package/cjs/common/number.js.map +1 -1
- package/cjs/common/pad.d.ts +21 -0
- package/cjs/common/pad.js +21 -1
- package/cjs/common/pad.js.map +1 -1
- package/cjs/common/random.d.ts +3 -0
- package/cjs/common/random.js +13 -0
- package/cjs/common/random.js.map +1 -1
- package/cjs/common/regression-bootstrap.d.ts +14 -0
- package/cjs/common/regression-bootstrap.js +37 -0
- package/cjs/common/regression-bootstrap.js.map +1 -0
- package/cjs/common/regression-linear.d.ts +5 -0
- package/cjs/common/regression-linear.js +28 -39
- package/cjs/common/regression-linear.js.map +1 -1
- package/cjs/common/regression-logistic.d.ts +6 -0
- package/cjs/common/regression-logistic.js +25 -14
- package/cjs/common/regression-logistic.js.map +1 -1
- package/cjs/common/regression-lowess.d.ts +11 -1
- package/cjs/common/regression-lowess.js +125 -118
- package/cjs/common/regression-lowess.js.map +1 -1
- package/cjs/common/regression-polynomial.d.ts +1 -0
- package/cjs/common/regression-polynomial.js +24 -94
- package/cjs/common/regression-polynomial.js.map +1 -1
- package/cjs/common/regression-solver.d.ts +26 -0
- package/cjs/common/regression-solver.js +180 -0
- package/cjs/common/regression-solver.js.map +1 -0
- package/cjs/common/regression-utils.d.ts +13 -1
- package/cjs/common/regression-utils.js +27 -12
- package/cjs/common/regression-utils.js.map +1 -1
- package/cjs/common/throttle.js +3 -0
- package/cjs/common/throttle.js.map +1 -1
- package/cjs/common/toDate.js +22 -3
- package/cjs/common/toDate.js.map +1 -1
- package/cjs/common/uuid.d.ts +7 -0
- package/cjs/common/uuid.js +15 -1
- package/cjs/common/uuid.js.map +1 -1
- package/cjs/data-structure/bounds.d.ts +101 -0
- package/cjs/data-structure/bounds.js +74 -7
- package/cjs/data-structure/bounds.js.map +1 -1
- package/cjs/data-structure/hashTable.d.ts +4 -0
- package/cjs/data-structure/hashTable.js +11 -2
- package/cjs/data-structure/hashTable.js.map +1 -1
- package/cjs/data-structure/index.js +6 -2
- package/cjs/data-structure/index.js.map +1 -1
- package/cjs/data-structure/matrix.d.ts +91 -0
- package/cjs/data-structure/matrix.js +52 -4
- package/cjs/data-structure/matrix.js.map +1 -1
- package/cjs/data-structure/point.d.ts +3 -0
- package/cjs/data-structure/point.js +5 -1
- package/cjs/data-structure/point.js.map +1 -1
- package/cjs/dom.d.ts +36 -0
- package/cjs/dom.js +43 -1
- package/cjs/dom.js.map +1 -1
- package/cjs/fmin/blas1.js +10 -1
- package/cjs/fmin/blas1.js.map +1 -1
- package/cjs/fmin/conjugate-gradient.js +18 -3
- package/cjs/fmin/conjugate-gradient.js.map +1 -1
- package/cjs/fmin/linesearch.js +15 -1
- package/cjs/fmin/linesearch.js.map +1 -1
- package/cjs/fmin/nelder-mead.d.ts +1 -0
- package/cjs/fmin/nelder-mead.js +30 -10
- package/cjs/fmin/nelder-mead.js.map +1 -1
- package/cjs/format/number/formatDecimal.js +9 -1
- package/cjs/format/number/formatDecimal.js.map +1 -1
- package/cjs/format/number/formatGroup.js +7 -0
- package/cjs/format/number/formatGroup.js.map +1 -1
- package/cjs/format/number/formatPrefixAuto.js +8 -0
- package/cjs/format/number/formatPrefixAuto.js.map +1 -1
- package/cjs/format/number/formatRounded.js +7 -0
- package/cjs/format/number/formatRounded.js.map +1 -1
- package/cjs/format/number/formatTrim.js +7 -0
- package/cjs/format/number/formatTrim.js.map +1 -1
- package/cjs/format/number/number.js +39 -9
- package/cjs/format/number/number.js.map +1 -1
- package/cjs/format/time.js +23 -6
- package/cjs/format/time.js.map +1 -1
- package/cjs/geo/circle-intersection.d.ts +12 -0
- package/cjs/geo/circle-intersection.js +54 -9
- package/cjs/geo/circle-intersection.js.map +1 -1
- package/cjs/geo/constant.js +8 -1
- package/cjs/geo/constant.js.map +1 -1
- package/cjs/geo/invariant.d.ts +22 -0
- package/cjs/geo/invariant.js +24 -1
- package/cjs/geo/invariant.js.map +1 -1
- package/cjs/graphics/algorithm/aabb.js +7 -3
- package/cjs/graphics/algorithm/aabb.js.map +1 -1
- package/cjs/graphics/algorithm/intersect.d.ts +48 -0
- package/cjs/graphics/algorithm/intersect.js +75 -7
- package/cjs/graphics/algorithm/intersect.js.map +1 -1
- package/cjs/graphics/bounds-util.js +4 -2
- package/cjs/graphics/bounds-util.js.map +1 -1
- package/cjs/graphics/graph-util.js +4 -0
- package/cjs/graphics/graph-util.js.map +1 -1
- package/cjs/graphics/index.js +7 -4
- package/cjs/graphics/index.js.map +1 -1
- package/cjs/graphics/polygon.d.ts +12 -0
- package/cjs/graphics/polygon.js +28 -5
- package/cjs/graphics/polygon.js.map +1 -1
- package/cjs/graphics/text/measure/interface.d.ts +12 -0
- package/cjs/graphics/text/measure/textMeasure.d.ts +23 -0
- package/cjs/graphics/text/measure/textMeasure.js +50 -22
- package/cjs/graphics/text/measure/textMeasure.js.map +1 -1
- package/cjs/graphics/text/measure/util.js +1 -0
- package/cjs/graphics/text/measure/util.js.map +1 -1
- package/cjs/graphics/text/stringWidth.js +7 -3
- package/cjs/graphics/text/stringWidth.js.map +1 -1
- package/cjs/index.d.ts +6 -0
- package/cjs/index.js +19 -4
- package/cjs/index.js.map +1 -1
- package/cjs/logger.js +12 -2
- package/cjs/logger.js.map +1 -1
- package/cjs/lru.js +14 -6
- package/cjs/lru.js.map +1 -1
- package/cjs/math.d.ts +9 -0
- package/cjs/math.js +10 -0
- package/cjs/math.js.map +1 -1
- package/cjs/padding.d.ts +5 -0
- package/cjs/padding.js +5 -0
- package/cjs/padding.js.map +1 -1
- package/cjs/time/formatUtils.d.ts +6 -0
- package/cjs/time/formatUtils.js +7 -0
- package/cjs/time/formatUtils.js.map +1 -1
- package/dist/index.js +2035 -411
- package/dist/index.min.js +128 -1
- package/es/angle.d.ts +61 -0
- package/es/angle.js +66 -10
- package/es/angle.js.map +1 -1
- package/es/color/Color.d.ts +3 -0
- package/es/color/Color.js +64 -9
- package/es/color/Color.js.map +1 -1
- package/es/color/hexToRgb.d.ts +5 -0
- package/es/color/hexToRgb.js +5 -0
- package/es/color/hexToRgb.js.map +1 -1
- package/es/color/rgbToHsl.js +5 -1
- package/es/color/rgbToHsl.js.map +1 -1
- package/es/common/array.d.ts +43 -0
- package/es/common/array.js +44 -8
- package/es/common/array.js.map +1 -1
- package/es/common/bisect.d.ts +21 -0
- package/es/common/bisect.js +29 -4
- package/es/common/bisect.js.map +1 -1
- package/es/common/bootstrap.d.ts +5 -0
- package/es/common/bootstrap.js +14 -0
- package/es/common/bootstrap.js.map +1 -0
- package/es/common/clone.js +6 -0
- package/es/common/clone.js.map +1 -1
- package/es/common/cloneDeep.js +4 -1
- package/es/common/cloneDeep.js.map +1 -1
- package/es/common/correlation.d.ts +3 -0
- package/es/common/correlation.js +77 -0
- package/es/common/correlation.js.map +1 -0
- package/es/common/debounce.js +22 -4
- package/es/common/debounce.js.map +1 -1
- package/es/common/deviation.js +1 -2
- package/es/common/ecdf.d.ts +8 -0
- package/es/common/ecdf.js +11 -1
- package/es/common/ecdf.js.map +1 -1
- package/es/common/extent.d.ts +4 -0
- package/es/common/extent.js +8 -3
- package/es/common/extent.js.map +1 -1
- package/es/common/field.d.ts +6 -0
- package/es/common/field.js +3 -1
- package/es/common/field.js.map +1 -1
- package/es/common/has.d.ts +17 -0
- package/es/common/has.js +18 -1
- package/es/common/has.js.map +1 -1
- package/es/common/index.d.ts +5 -0
- package/es/common/index.js +24 -0
- package/es/common/index.js.map +1 -1
- package/es/common/interpolate.js +16 -3
- package/es/common/interpolate.js.map +1 -1
- package/es/common/isBase64.d.ts +6 -0
- package/es/common/isBase64.js +6 -0
- package/es/common/isBase64.js.map +1 -1
- package/es/common/isBoolean.d.ts +13 -0
- package/es/common/isBoolean.js +13 -1
- package/es/common/isBoolean.js.map +1 -1
- package/es/common/isEmpty.js +11 -1
- package/es/common/isEmpty.js.map +1 -1
- package/es/common/isEqual.js +19 -7
- package/es/common/isEqual.js.map +1 -1
- package/es/common/isFunction.d.ts +25 -0
- package/es/common/isFunction.js +27 -2
- package/es/common/isFunction.js.map +1 -1
- package/es/common/isNull.js +2 -1
- package/es/common/isNumber.d.ts +23 -0
- package/es/common/isNumber.js +23 -1
- package/es/common/isNumber.js.map +1 -1
- package/es/common/isNumeric.d.ts +25 -0
- package/es/common/isNumeric.js +25 -0
- package/es/common/isNumeric.js.map +1 -1
- package/es/common/isObject.d.ts +21 -0
- package/es/common/isObject.js +22 -0
- package/es/common/isObject.js.map +1 -1
- package/es/common/isObjectLike.d.ts +20 -0
- package/es/common/isObjectLike.js +21 -0
- package/es/common/isObjectLike.js.map +1 -1
- package/es/common/isPlainObject.d.ts +25 -0
- package/es/common/isPlainObject.js +26 -0
- package/es/common/isPlainObject.js.map +1 -1
- package/es/common/isPrototype.js +1 -1
- package/es/common/isRegExp.js +1 -1
- package/es/common/isShallowEqual.js +1 -0
- package/es/common/isShallowEqual.js.map +1 -1
- package/es/common/isString.d.ts +13 -0
- package/es/common/isString.js +13 -1
- package/es/common/isString.js.map +1 -1
- package/es/common/isType.d.ts +6 -0
- package/es/common/isType.js +6 -0
- package/es/common/isType.js.map +1 -1
- package/es/common/isValidNumber.js.map +1 -1
- package/es/common/isValidUrl.js.map +1 -1
- package/es/common/kde.d.ts +28 -0
- package/es/common/kde.js +29 -7
- package/es/common/kde.js.map +1 -1
- package/es/common/mean.d.ts +2 -0
- package/es/common/mean.js +19 -0
- package/es/common/mean.js.map +1 -0
- package/es/common/merge.js +22 -5
- package/es/common/merge.js.map +1 -1
- package/es/common/mixin.js +14 -3
- package/es/common/mixin.js.map +1 -1
- package/es/common/normalQuantile.d.ts +5 -0
- package/es/common/normalQuantile.js +15 -0
- package/es/common/normalQuantile.js.map +1 -0
- package/es/common/number.d.ts +24 -0
- package/es/common/number.js +24 -2
- package/es/common/number.js.map +1 -1
- package/es/common/pad.d.ts +21 -0
- package/es/common/pad.js +21 -1
- package/es/common/pad.js.map +1 -1
- package/es/common/random.d.ts +3 -0
- package/es/common/random.js +13 -1
- package/es/common/random.js.map +1 -1
- package/es/common/regression-bootstrap.d.ts +14 -0
- package/es/common/regression-bootstrap.js +31 -0
- package/es/common/regression-bootstrap.js.map +1 -0
- package/es/common/regression-linear.d.ts +5 -0
- package/es/common/regression-linear.js +25 -39
- package/es/common/regression-linear.js.map +1 -1
- package/es/common/regression-logistic.d.ts +6 -0
- package/es/common/regression-logistic.js +24 -16
- package/es/common/regression-logistic.js.map +1 -1
- package/es/common/regression-lowess.d.ts +11 -1
- package/es/common/regression-lowess.js +120 -118
- package/es/common/regression-lowess.js.map +1 -1
- package/es/common/regression-polynomial.d.ts +1 -0
- package/es/common/regression-polynomial.js +21 -89
- package/es/common/regression-polynomial.js.map +1 -1
- package/es/common/regression-solver.d.ts +26 -0
- package/es/common/regression-solver.js +168 -0
- package/es/common/regression-solver.js.map +1 -0
- package/es/common/regression-utils.d.ts +13 -1
- package/es/common/regression-utils.js +18 -9
- package/es/common/regression-utils.js.map +1 -1
- package/es/common/throttle.js +3 -0
- package/es/common/throttle.js.map +1 -1
- package/es/common/toDate.js +23 -3
- package/es/common/toDate.js.map +1 -1
- package/es/common/uuid.d.ts +7 -0
- package/es/common/uuid.js +15 -1
- package/es/common/uuid.js.map +1 -1
- package/es/data-structure/bounds.d.ts +101 -0
- package/es/data-structure/bounds.js +74 -8
- package/es/data-structure/bounds.js.map +1 -1
- package/es/data-structure/hashTable.d.ts +4 -0
- package/es/data-structure/hashTable.js +11 -2
- package/es/data-structure/hashTable.js.map +1 -1
- package/es/data-structure/index.js +2 -0
- package/es/data-structure/index.js.map +1 -1
- package/es/data-structure/matrix.d.ts +91 -0
- package/es/data-structure/matrix.js +52 -5
- package/es/data-structure/matrix.js.map +1 -1
- package/es/data-structure/point.d.ts +3 -0
- package/es/data-structure/point.js +5 -1
- package/es/data-structure/point.js.map +1 -1
- package/es/dom.d.ts +36 -0
- package/es/dom.js +43 -8
- package/es/dom.js.map +1 -1
- package/es/fmin/blas1.js +10 -0
- package/es/fmin/blas1.js.map +1 -1
- package/es/fmin/conjugate-gradient.js +18 -2
- package/es/fmin/conjugate-gradient.js.map +1 -1
- package/es/fmin/linesearch.js +15 -0
- package/es/fmin/linesearch.js.map +1 -1
- package/es/fmin/nelder-mead.d.ts +1 -0
- package/es/fmin/nelder-mead.js +29 -9
- package/es/fmin/nelder-mead.js.map +1 -1
- package/es/format/number/formatDecimal.js +9 -1
- package/es/format/number/formatDecimal.js.map +1 -1
- package/es/format/number/formatGroup.js +7 -0
- package/es/format/number/formatGroup.js.map +1 -1
- package/es/format/number/formatPrefixAuto.js +8 -0
- package/es/format/number/formatPrefixAuto.js.map +1 -1
- package/es/format/number/formatRounded.js +7 -0
- package/es/format/number/formatRounded.js.map +1 -1
- package/es/format/number/formatTrim.js +7 -0
- package/es/format/number/formatTrim.js.map +1 -1
- package/es/format/number/number.js +40 -8
- package/es/format/number/number.js.map +1 -1
- package/es/format/time.js +23 -5
- package/es/format/time.js.map +1 -1
- package/es/geo/circle-intersection.d.ts +12 -0
- package/es/geo/circle-intersection.js +54 -14
- package/es/geo/circle-intersection.js.map +1 -1
- package/es/geo/constant.js +8 -0
- package/es/geo/constant.js.map +1 -1
- package/es/geo/invariant.d.ts +22 -0
- package/es/geo/invariant.js +24 -0
- package/es/geo/invariant.js.map +1 -1
- package/es/graphics/algorithm/aabb.js +7 -3
- package/es/graphics/algorithm/aabb.js.map +1 -1
- package/es/graphics/algorithm/intersect.d.ts +48 -0
- package/es/graphics/algorithm/intersect.js +75 -12
- package/es/graphics/algorithm/intersect.js.map +1 -1
- package/es/graphics/bounds-util.js +4 -2
- package/es/graphics/bounds-util.js.map +1 -1
- package/es/graphics/graph-util.js +4 -0
- package/es/graphics/graph-util.js.map +1 -1
- package/es/graphics/index.js +2 -0
- package/es/graphics/index.js.map +1 -1
- package/es/graphics/polygon.d.ts +12 -0
- package/es/graphics/polygon.js +28 -6
- package/es/graphics/polygon.js.map +1 -1
- package/es/graphics/text/measure/interface.d.ts +12 -0
- package/es/graphics/text/measure/textMeasure.d.ts +23 -0
- package/es/graphics/text/measure/textMeasure.js +46 -21
- package/es/graphics/text/measure/textMeasure.js.map +1 -1
- package/es/graphics/text/measure/util.js +1 -0
- package/es/graphics/text/measure/util.js.map +1 -1
- package/es/graphics/text/stringWidth.js +7 -3
- package/es/graphics/text/stringWidth.js.map +1 -1
- package/es/index.d.ts +6 -0
- package/es/index.js +15 -1
- package/es/index.js.map +1 -1
- package/es/logger.js +12 -1
- package/es/logger.js.map +1 -1
- package/es/lru.js +14 -6
- package/es/lru.js.map +1 -1
- package/es/math.d.ts +9 -0
- package/es/math.js +10 -1
- package/es/math.js.map +1 -1
- package/es/padding.d.ts +5 -0
- package/es/padding.js +5 -1
- package/es/padding.js.map +1 -1
- package/es/time/formatUtils.d.ts +6 -0
- package/es/time/formatUtils.js +7 -1
- package/es/time/formatUtils.js.map +1 -1
- package/package.json +4 -3
package/es/color/rgbToHsl.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/color/rgbToHsl.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAC9D,CAAC,IAAI,GAAG,CAAC;IACT,CAAC,IAAI,GAAG,CAAC;IACT,CAAC,IAAI,GAAG,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/color/rgbToHsl.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,QAAQ,CAAC,CAAS,EAAE,CAAS,EAAE,CAAS;IAC9D,CAAC,IAAI,GAAG,CAAC;IACT,CAAC,IAAI,GAAG,CAAC;IACT,CAAC,IAAI,GAAG,CAAC;IAET,4CAA4C;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,MAAM,KAAK,GAAG,IAAI,GAAG,IAAI,CAAC;IAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,IAAI,KAAK,KAAK,CAAC,EAAE;QACf,CAAC,GAAG,CAAC,CAAC;KACP;IACD,aAAa;SACR,IAAI,IAAI,KAAK,CAAC,EAAE;QACnB,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;KAC3B;IACD,eAAe;SACV,IAAI,IAAI,KAAK,CAAC,EAAE;QACnB,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;KACzB;IACD,cAAc;SACT;QACH,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;KACzB;IAED,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC;IACvB,IAAI,CAAC,GAAG,CAAC,EAAE;QACT,CAAC,IAAI,GAAG,CAAC;KACV;IACD,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;IAEtB,uBAAuB;IACvB,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAExD,0BAA0B;IAC1B,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC1B,OAAO;QACL,CAAC;QACD,CAAC;QACD,CAAC;KACF,CAAC;AACJ,CAAC","file":"rgbToHsl.js","sourcesContent":["export default function rgbToHsl(r: number, g: number, b: number) {\n r /= 255;\n g /= 255;\n b /= 255;\n\n // Find greatest and smallest channel values\n const cMin = Math.min(r, g, b);\n const cMax = Math.max(r, g, b);\n const delta = cMax - cMin;\n let h = 0;\n let s = 0;\n let l = 0;\n\n if (delta === 0) {\n h = 0;\n }\n // Red is max\n else if (cMax === r) {\n h = ((g - b) / delta) % 6;\n }\n // Green is max\n else if (cMax === g) {\n h = (b - r) / delta + 2;\n }\n // Blue is max\n else {\n h = (r - g) / delta + 4;\n }\n\n h = Math.round(h * 60);\n if (h < 0) {\n h += 360;\n }\n l = (cMax + cMin) / 2;\n\n // Calculate saturation\n s = delta === 0 ? 0 : delta / (1 - Math.abs(2 * l - 1));\n\n // Multiply l and s by 100\n s = +(s * 100).toFixed(1);\n l = +(l * 100).toFixed(1);\n return {\n h,\n s,\n l\n };\n}\n"]}
|
package/es/common/array.d.ts
CHANGED
|
@@ -1,9 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 将传入数据转换为数组格式
|
|
3
|
+
* @param arr 入参。
|
|
4
|
+
* @returns 数组
|
|
5
|
+
*/
|
|
1
6
|
export declare function array<T>(arr?: T | T[]): T[];
|
|
7
|
+
/**
|
|
8
|
+
* 获取数组的最后一个值,如果传入的参数为非数组,则返回 undefined
|
|
9
|
+
* @param val any
|
|
10
|
+
* @returns
|
|
11
|
+
*/
|
|
2
12
|
export declare function last<T>(val: T | T[]): T | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* 获取数组第一项与最后一项的差值,如果数组为空则返回 0
|
|
15
|
+
* @param arr
|
|
16
|
+
* @returns
|
|
17
|
+
*/
|
|
3
18
|
export declare const span: (arr: number[]) => number;
|
|
19
|
+
/**
|
|
20
|
+
* 获取数组中的最大值
|
|
21
|
+
* @param arr 数组
|
|
22
|
+
* @param compareFn 比较函数,返回正数表示 a > b,返回负数表示 a < b,返回 0 表示相等
|
|
23
|
+
* @returns
|
|
24
|
+
*/
|
|
4
25
|
export declare const maxInArray: <T>(arr: T[], compareFn?: (a: T, b: T) => number) => T;
|
|
26
|
+
/**
|
|
27
|
+
* 获取数组中的最小值
|
|
28
|
+
* @param arr 数组
|
|
29
|
+
* @param compareFn 比较函数,返回正数表示 a > b,返回负数表示 a < b,返回 0 表示相等
|
|
30
|
+
* @returns
|
|
31
|
+
*/
|
|
5
32
|
export declare const minInArray: <T>(arr: T[], compareFn?: (a: T, b: T) => number) => T;
|
|
33
|
+
/**
|
|
34
|
+
* 判断两个数组是否相同
|
|
35
|
+
* @param a
|
|
36
|
+
* @param b
|
|
37
|
+
* @returns
|
|
38
|
+
*/
|
|
6
39
|
export declare function arrayEqual(a: any, b: any): boolean;
|
|
40
|
+
/**
|
|
41
|
+
* 封装并返回无重复的数组
|
|
42
|
+
* @param arr
|
|
43
|
+
* @returns
|
|
44
|
+
*/
|
|
7
45
|
export declare function uniqArray<T>(arr: T | T[]): T | T[];
|
|
8
46
|
export declare function shuffleArray<T>(arr: T[], random?: () => number): T[];
|
|
47
|
+
/**
|
|
48
|
+
* 展开多层数组,非数组内容将变为 [input]
|
|
49
|
+
* @param arr
|
|
50
|
+
* @returns
|
|
51
|
+
*/
|
|
9
52
|
export declare function flattenArray(arr: any): any[];
|
package/es/common/array.js
CHANGED
|
@@ -4,19 +4,36 @@ import isArrayLike from "./isArrayLike";
|
|
|
4
4
|
|
|
5
5
|
import isValid from "./isValid";
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* 将传入数据转换为数组格式
|
|
9
|
+
* @param arr 入参。
|
|
10
|
+
* @returns 数组
|
|
11
|
+
*/ export function array(arr) {
|
|
8
12
|
return isValid(arr) ? isArray(arr) ? arr : [ arr ] : [];
|
|
9
13
|
}
|
|
10
14
|
|
|
11
|
-
|
|
15
|
+
/**
|
|
16
|
+
* 获取数组的最后一个值,如果传入的参数为非数组,则返回 undefined
|
|
17
|
+
* @param val any
|
|
18
|
+
* @returns
|
|
19
|
+
*/ export function last(val) {
|
|
12
20
|
if (isArrayLike(val)) {
|
|
13
21
|
return val[val.length - 1];
|
|
14
22
|
}
|
|
15
23
|
}
|
|
16
24
|
|
|
17
|
-
|
|
25
|
+
/**
|
|
26
|
+
* 获取数组第一项与最后一项的差值,如果数组为空则返回 0
|
|
27
|
+
* @param arr
|
|
28
|
+
* @returns
|
|
29
|
+
*/ export const span = arr => arr.length <= 1 ? 0 : last(arr) - arr[0];
|
|
18
30
|
|
|
19
|
-
|
|
31
|
+
/**
|
|
32
|
+
* 获取数组中的最大值
|
|
33
|
+
* @param arr 数组
|
|
34
|
+
* @param compareFn 比较函数,返回正数表示 a > b,返回负数表示 a < b,返回 0 表示相等
|
|
35
|
+
* @returns
|
|
36
|
+
*/ export const maxInArray = (arr, compareFn) => {
|
|
20
37
|
var _a;
|
|
21
38
|
if (0 === arr.length) return;
|
|
22
39
|
let max = arr[0];
|
|
@@ -27,7 +44,12 @@ export const maxInArray = (arr, compareFn) => {
|
|
|
27
44
|
return max;
|
|
28
45
|
};
|
|
29
46
|
|
|
30
|
-
|
|
47
|
+
/**
|
|
48
|
+
* 获取数组中的最小值
|
|
49
|
+
* @param arr 数组
|
|
50
|
+
* @param compareFn 比较函数,返回正数表示 a > b,返回负数表示 a < b,返回 0 表示相等
|
|
51
|
+
* @returns
|
|
52
|
+
*/ export const minInArray = (arr, compareFn) => {
|
|
31
53
|
var _a;
|
|
32
54
|
if (0 === arr.length) return;
|
|
33
55
|
let min = arr[0];
|
|
@@ -38,24 +60,38 @@ export const minInArray = (arr, compareFn) => {
|
|
|
38
60
|
return min;
|
|
39
61
|
};
|
|
40
62
|
|
|
41
|
-
|
|
63
|
+
/**
|
|
64
|
+
* 判断两个数组是否相同
|
|
65
|
+
* @param a
|
|
66
|
+
* @param b
|
|
67
|
+
* @returns
|
|
68
|
+
*/ export function arrayEqual(a, b) {
|
|
42
69
|
if (!isArray(a) || !isArray(b)) return !1;
|
|
43
70
|
if (a.length !== b.length) return !1;
|
|
44
71
|
for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return !1;
|
|
45
72
|
return !0;
|
|
46
73
|
}
|
|
47
74
|
|
|
48
|
-
|
|
75
|
+
/**
|
|
76
|
+
* 封装并返回无重复的数组
|
|
77
|
+
* @param arr
|
|
78
|
+
* @returns
|
|
79
|
+
*/ export function uniqArray(arr) {
|
|
49
80
|
return arr && isArray(arr) ? Array.from(new Set(array(arr))) : arr;
|
|
50
81
|
}
|
|
51
82
|
|
|
83
|
+
// Based on http://jsfromhell.com/array/shuffle
|
|
52
84
|
export function shuffleArray(arr, random = Math.random) {
|
|
53
85
|
let j, x, i = arr.length;
|
|
54
86
|
for (;i; ) j = Math.floor(random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x;
|
|
55
87
|
return arr;
|
|
56
88
|
}
|
|
57
89
|
|
|
58
|
-
|
|
90
|
+
/**
|
|
91
|
+
* 展开多层数组,非数组内容将变为 [input]
|
|
92
|
+
* @param arr
|
|
93
|
+
* @returns
|
|
94
|
+
*/ export function flattenArray(arr) {
|
|
59
95
|
if (!isArray(arr)) return [ arr ];
|
|
60
96
|
const result = [];
|
|
61
97
|
for (const value of arr) result.push(...flattenArray(value));
|
package/es/common/array.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/common/array.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,OAAO,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/common/array.ts"],"names":[],"mappings":"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","file":"array.js","sourcesContent":["import isArray from './isArray';\nimport isArrayLike from './isArrayLike';\nimport isValid from './isValid';\n\n/**\n * 将传入数据转换为数组格式\n * @param arr 入参。\n * @returns 数组\n */\nexport function array<T>(arr?: T | T[]): T[] {\n if (isValid(arr)) {\n return isArray(arr) ? arr : [arr];\n }\n return [];\n}\n\n/**\n * 获取数组的最后一个值,如果传入的参数为非数组,则返回 undefined\n * @param val any\n * @returns\n */\nexport function last<T>(val: T | T[]): T | undefined {\n if (isArrayLike(val)) {\n const arr = val as ArrayLike<any>;\n return arr[arr.length - 1];\n }\n return undefined;\n}\n\n/**\n * 获取数组第一项与最后一项的差值,如果数组为空\b则返回 0\n * @param arr\n * @returns\n */\nexport const span = (arr: number[]) => {\n if (arr.length <= 1) {\n return 0;\n }\n return (last(arr) as number) - arr[0];\n};\n\n/**\n * 获取数组中的最大值\n * @param arr 数组\n * @param compareFn 比较函数,返回正数表示 a > b,返回负数表示 a < b,返回 0 表示相等\n * @returns\n */\nexport const maxInArray = <T>(arr: T[], compareFn?: (a: T, b: T) => number): T | undefined => {\n if (arr.length === 0) {\n return undefined;\n }\n let max = arr[0];\n for (let i = 1; i < arr.length; i++) {\n const value = arr[i];\n if ((compareFn?.(value, max) ?? (value as number) - (max as number)) > 0) {\n max = value;\n }\n }\n return max;\n};\n\n/**\n * 获取数组中的最小值\n * @param arr 数组\n * @param compareFn 比较函数,返回正数表示 a > b,返回负数表示 a < b,返回 0 表示相等\n * @returns\n */\nexport const minInArray = <T>(arr: T[], compareFn?: (a: T, b: T) => number): T | undefined => {\n if (arr.length === 0) {\n return undefined;\n }\n let min = arr[0];\n for (let i = 1; i < arr.length; i++) {\n const value = arr[i];\n if ((compareFn?.(value, min) ?? (value as number) - (min as number)) < 0) {\n min = value;\n }\n }\n return min;\n};\n\n/**\n * 判断两个数组是否相同\n * @param a\n * @param b\n * @returns\n */\nexport function arrayEqual(a: any, b: any): boolean {\n if (!isArray(a) || !isArray(b)) {\n return false;\n }\n if (a.length !== b.length) {\n return false;\n }\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * 封装并返回无重复的数组\n * @param arr\n * @returns\n */\nexport function uniqArray<T>(arr: T | T[]): T | T[] {\n if (!arr || !isArray(arr)) {\n return arr;\n }\n return Array.from(new Set(array(arr)));\n}\n\n// Based on http://jsfromhell.com/array/shuffle\nexport function shuffleArray<T>(arr: T[], random: () => number = Math.random): T[] {\n let j;\n let x;\n let i = arr.length;\n\n while (i) {\n j = Math.floor(random() * i);\n x = arr[--i];\n arr[i] = arr[j];\n arr[j] = x;\n }\n return arr;\n}\n\n/**\n * 展开多层数组,非数组内容将变为 [input]\n * @param arr\n * @returns\n */\nexport function flattenArray(arr: any): any[] {\n if (!isArray(arr)) {\n return [arr];\n }\n const result = [];\n for (const value of arr) {\n result.push(...flattenArray(value));\n }\n return result;\n}\n"]}
|
package/es/common/bisect.d.ts
CHANGED
|
@@ -1,7 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 通过二分法,查找数组a中大于数值x的第一个元素的序号
|
|
3
|
+
* @param a
|
|
4
|
+
* @param x
|
|
5
|
+
* @param lo
|
|
6
|
+
* @param hi
|
|
7
|
+
* @returns
|
|
8
|
+
*/
|
|
1
9
|
export declare function bisect(a: number[], x: number, lo?: number, hi?: number): number;
|
|
10
|
+
/** finds the zeros of a function, given two starting points (which must
|
|
11
|
+
* have opposite signs */
|
|
2
12
|
export declare function findZeroOfFunction(f: (entry: number) => number, a: number, b: number, parameters?: {
|
|
3
13
|
maxIterations?: number;
|
|
4
14
|
tolerance?: number;
|
|
5
15
|
}): number;
|
|
16
|
+
/**
|
|
17
|
+
* 二分靠近框架,返回数组中第一个大于等于目标值的数的索引
|
|
18
|
+
* @param arr 数组
|
|
19
|
+
* @param compareFn 比较函数,返回(当前值-目标值)
|
|
20
|
+
*/
|
|
6
21
|
export declare const binaryFuzzySearch: <T>(arr: T[], compareFn: (value: T) => number) => number;
|
|
22
|
+
/**
|
|
23
|
+
* 二分靠近框架,返回数字区间中第一个大于等于目标值的数字
|
|
24
|
+
* @param x1 区间上界
|
|
25
|
+
* @param x2 区间下界(不包含)
|
|
26
|
+
* @param compareFn 比较函数,返回(当前值-目标值)
|
|
27
|
+
*/
|
|
7
28
|
export declare const binaryFuzzySearchInNumberRange: (x1: number, x2: number, compareFn: (value: number) => number) => number;
|
package/es/common/bisect.js
CHANGED
|
@@ -4,7 +4,14 @@ import isNil from "./isNil";
|
|
|
4
4
|
|
|
5
5
|
import { Logger } from "../logger";
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* 通过二分法,查找数组a中大于数值x的第一个元素的序号
|
|
9
|
+
* @param a
|
|
10
|
+
* @param x
|
|
11
|
+
* @param lo
|
|
12
|
+
* @param hi
|
|
13
|
+
* @returns
|
|
14
|
+
*/ export function bisect(a, x, lo = 0, hi) {
|
|
8
15
|
for (isNil(hi) && (hi = a.length); lo < hi; ) {
|
|
9
16
|
const mid = lo + hi >>> 1;
|
|
10
17
|
ascending(a[mid], x) > 0 ? hi = mid : lo = mid + 1;
|
|
@@ -12,7 +19,16 @@ export function bisect(a, x, lo = 0, hi) {
|
|
|
12
19
|
return lo;
|
|
13
20
|
}
|
|
14
21
|
|
|
15
|
-
|
|
22
|
+
/* Adapted from fmin by Ben Frederickson
|
|
23
|
+
* https://github.com/benfred/fmin
|
|
24
|
+
* Licensed under the BSD-3-Clause
|
|
25
|
+
|
|
26
|
+
* url: https://github.com/benfred/fmin/blob/master/src/bisect.js
|
|
27
|
+
* License: https://github.com/benfred/fmin/blob/master/LICENSE
|
|
28
|
+
* @license
|
|
29
|
+
*/
|
|
30
|
+
/** finds the zeros of a function, given two starting points (which must
|
|
31
|
+
* have opposite signs */ export function findZeroOfFunction(f, a, b, parameters) {
|
|
16
32
|
var _a, _b;
|
|
17
33
|
const maxIterations = null !== (_a = null == parameters ? void 0 : parameters.maxIterations) && void 0 !== _a ? _a : 100, tolerance = null !== (_b = null == parameters ? void 0 : parameters.tolerance) && void 0 !== _b ? _b : 1e-10, fA = f(a), fB = f(b);
|
|
18
34
|
let delta = b - a;
|
|
@@ -30,9 +46,18 @@ export function findZeroOfFunction(f, a, b, parameters) {
|
|
|
30
46
|
return a + delta;
|
|
31
47
|
}
|
|
32
48
|
|
|
33
|
-
|
|
49
|
+
/**
|
|
50
|
+
* 二分靠近框架,返回数组中第一个大于等于目标值的数的索引
|
|
51
|
+
* @param arr 数组
|
|
52
|
+
* @param compareFn 比较函数,返回(当前值-目标值)
|
|
53
|
+
*/ export const binaryFuzzySearch = (arr, compareFn) => binaryFuzzySearchInNumberRange(0, arr.length, (value => compareFn(arr[value])));
|
|
34
54
|
|
|
35
|
-
|
|
55
|
+
/**
|
|
56
|
+
* 二分靠近框架,返回数字区间中第一个大于等于目标值的数字
|
|
57
|
+
* @param x1 区间上界
|
|
58
|
+
* @param x2 区间下界(不包含)
|
|
59
|
+
* @param compareFn 比较函数,返回(当前值-目标值)
|
|
60
|
+
*/ export const binaryFuzzySearchInNumberRange = (x1, x2, compareFn) => {
|
|
36
61
|
let left = x1, right = x2;
|
|
37
62
|
for (;left < right; ) {
|
|
38
63
|
const mid = Math.floor((left + right) / 2);
|
package/es/common/bisect.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/common/bisect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,MAAM,SAAS,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/common/bisect.ts"],"names":[],"mappings":"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","file":"bisect.js","sourcesContent":["import { ascending } from './ascending';\nimport isNil from './isNil';\nimport { Logger } from '../logger';\n\n/**\n * 通过二分法,查找数组a中大于数值x的第一个元素的序号\n * @param a\n * @param x\n * @param lo\n * @param hi\n * @returns\n */\nexport function bisect(a: number[], x: number, lo: number = 0, hi?: number) {\n if (isNil(hi)) {\n hi = a.length;\n }\n while (lo < (hi as number)) {\n const mid: number = (lo + (hi as number)) >>> 1;\n if (ascending(a[mid], x) > 0) {\n hi = mid;\n } else {\n lo = mid + 1;\n }\n }\n return lo;\n}\n\n/* Adapted from fmin by Ben Frederickson\n * https://github.com/benfred/fmin\n * Licensed under the BSD-3-Clause\n\n * url: https://github.com/benfred/fmin/blob/master/src/bisect.js\n * License: https://github.com/benfred/fmin/blob/master/LICENSE\n * @license\n */\n/** finds the zeros of a function, given two starting points (which must\n * have opposite signs */\nexport function findZeroOfFunction(\n f: (entry: number) => number,\n a: number,\n b: number,\n parameters?: {\n maxIterations?: number;\n tolerance?: number;\n }\n) {\n const maxIterations = parameters?.maxIterations ?? 100;\n const tolerance = parameters?.tolerance ?? 1e-10;\n const fA = f(a);\n const fB = f(b);\n let delta = b - a;\n\n if (fA * fB > 0) {\n const logger = Logger.getInstance();\n logger.error('Initial bisect points must have opposite signs');\n return NaN;\n }\n\n if (fA === 0) {\n return a;\n }\n if (fB === 0) {\n return b;\n }\n\n for (let i = 0; i < maxIterations; ++i) {\n delta /= 2;\n const mid = a + delta;\n const fMid = f(mid);\n\n if (fMid * fA >= 0) {\n a = mid;\n }\n\n if (Math.abs(delta) < tolerance || fMid === 0) {\n return mid;\n }\n }\n return a + delta;\n}\n\n/**\n * 二分靠近框架,返回数组中第一个大于等于目标值的数的索引\n * @param arr 数组\n * @param compareFn 比较函数,返回(当前值-目标值)\n */\nexport const binaryFuzzySearch = <T>(arr: T[], compareFn: (value: T) => number) => {\n return binaryFuzzySearchInNumberRange(0, arr.length, value => compareFn(arr[value]));\n};\n\n/**\n * 二分靠近框架,返回数字区间中第一个大于等于目标值的数字\n * @param x1 区间上界\n * @param x2 区间下界(不包含)\n * @param compareFn 比较函数,返回(当前值-目标值)\n */\nexport const binaryFuzzySearchInNumberRange = (x1: number, x2: number, compareFn: (value: number) => number) => {\n let left = x1;\n let right = x2;\n while (left < right) {\n const mid = Math.floor((left + right) / 2);\n if (compareFn(mid) >= 0) {\n right = mid; // 第一个大于等于目标值的数\n } else {\n left = mid + 1;\n }\n }\n return left;\n};\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { randomLCG } from "./random";
|
|
2
|
+
|
|
3
|
+
/** 有放回重采样;回调不得修改或持有复用的只读样本缓冲区。 */ export function bootstrapEstimate(values, estimator, options) {
|
|
4
|
+
if (!values.length || values.some((value => !Number.isFinite(value))) || !Number.isInteger(options.resamples) || options.resamples < 1 || !Number.isInteger(options.seed) || options.seed < 0 || options.seed > 4294967295) throw new RangeError("bootstrap requires finite observations, positive resamples and a uint32 seed");
|
|
5
|
+
const random = randomLCG(options.seed), sample = new Array(values.length), estimates = new Array(options.resamples);
|
|
6
|
+
for (let b = 0; b < options.resamples; b++) {
|
|
7
|
+
for (let i = 0; i < sample.length; i++) sample[i] = values[Math.floor(random() * values.length)];
|
|
8
|
+
const estimate = estimator(sample);
|
|
9
|
+
if (!Number.isFinite(estimate)) throw new RangeError("bootstrap estimator must return a finite number");
|
|
10
|
+
estimates[b] = estimate;
|
|
11
|
+
}
|
|
12
|
+
return estimates;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=bootstrap.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/common/bootstrap.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AACrC,kCAAkC;AAClC,MAAM,UAAU,iBAAiB,CAC/B,MAAyB,EACzB,SAAgD,EAChD,OAA4C;IAE5C,IACE,CAAC,MAAM,CAAC,MAAM;QACd,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7C,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC;QACpC,OAAO,CAAC,SAAS,GAAG,CAAC;QACrB,CAAC,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC;QAC/B,OAAO,CAAC,IAAI,GAAG,CAAC;QAChB,OAAO,CAAC,IAAI,GAAG,UAAU,EACzB;QACA,MAAM,IAAI,UAAU,CAAC,8EAA8E,CAAC,CAAC;KACtG;IACD,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,MAAM,GAAG,IAAI,KAAK,CAAS,MAAM,CAAC,MAAM,CAAC,CAAC;IAChD,MAAM,SAAS,GAAG,IAAI,KAAK,CAAS,OAAO,CAAC,SAAS,CAAC,CAAC;IACvD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;QAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;SAC1D;QACD,MAAM,QAAQ,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;QACnC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;YAC9B,MAAM,IAAI,UAAU,CAAC,iDAAiD,CAAC,CAAC;SACzE;QACD,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC;KACzB;IACD,OAAO,SAAS,CAAC;AACnB,CAAC","file":"bootstrap.js","sourcesContent":["import { randomLCG } from './random';\n/** 有放回重采样;回调不得修改或持有复用的只读样本缓冲区。 */\nexport function bootstrapEstimate(\n values: readonly number[],\n estimator: (sample: readonly number[]) => number,\n options: { resamples: number; seed: number }\n): number[] {\n if (\n !values.length ||\n values.some(value => !Number.isFinite(value)) ||\n !Number.isInteger(options.resamples) ||\n options.resamples < 1 ||\n !Number.isInteger(options.seed) ||\n options.seed < 0 ||\n options.seed > 0xffffffff\n ) {\n throw new RangeError('bootstrap requires finite observations, positive resamples and a uint32 seed');\n }\n const random = randomLCG(options.seed);\n const sample = new Array<number>(values.length);\n const estimates = new Array<number>(options.resamples);\n for (let b = 0; b < options.resamples; b++) {\n for (let i = 0; i < sample.length; i++) {\n sample[i] = values[Math.floor(random() * values.length)];\n }\n const estimate = estimator(sample);\n if (!Number.isFinite(estimate)) {\n throw new RangeError('bootstrap estimator must return a finite number');\n }\n estimates[b] = estimate;\n }\n return estimates;\n}\n"]}
|
package/es/common/clone.js
CHANGED
|
@@ -10,10 +10,16 @@ function getRegExpFlags(re) {
|
|
|
10
10
|
flags;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
// Adapted from https://github.com/pvorb/clone by Paul Vorbach
|
|
14
|
+
// License: https://github.com/pvorb/clone/blob/master/LICENSE
|
|
13
15
|
export default function clone(parent, circular = !1, depth = 0, prototype = void 0) {
|
|
16
|
+
// maintain two arrays for circular references, where corresponding parents
|
|
17
|
+
// and children have the same index
|
|
14
18
|
const allParents = [], allChildren = [];
|
|
15
19
|
return void 0 === circular && (circular = !0), void 0 === depth && (depth = 1 / 0),
|
|
20
|
+
// recurse this function so we don't reset allParents and allChildren
|
|
16
21
|
function _clone(parent, depth) {
|
|
22
|
+
// cloning null always returns null
|
|
17
23
|
if (null === parent) return null;
|
|
18
24
|
if (0 === depth) return parent;
|
|
19
25
|
let child;
|
package/es/common/clone.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/common/clone.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,SAAS,cAAc,CAAC,EAAO;IAC7B,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,EAAE,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IAC5B,EAAE,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IAChC,EAAE,CAAC,SAAS,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC;AACf,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/common/clone.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,QAAQ,MAAM,YAAY,CAAC;AAElC,SAAS,cAAc,CAAC,EAAO;IAC7B,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,EAAE,CAAC,MAAM,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IAC5B,EAAE,CAAC,UAAU,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IAChC,EAAE,CAAC,SAAS,IAAI,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IAC/B,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8DAA8D;AAC9D,8DAA8D;AAC9D,MAAM,CAAC,OAAO,UAAU,KAAK,CAAC,MAAW,EAAE,QAAQ,GAAG,KAAK,EAAE,KAAK,GAAG,CAAC,EAAE,YAAiB,SAAS;IAChG,2EAA2E;IAC3E,mCAAmC;IACnC,MAAM,UAAU,GAAe,EAAE,CAAC;IAClC,MAAM,WAAW,GAAe,EAAE,CAAC;IAEnC,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;QACnC,QAAQ,GAAG,IAAI,CAAC;KACjB;IAED,IAAI,OAAO,KAAK,KAAK,WAAW,EAAE;QAChC,KAAK,GAAG,QAAQ,CAAC;KAClB;IAED,qEAAqE;IACrE,SAAS,MAAM,CAAC,MAAW,EAAE,KAAa;QACxC,mCAAmC;QACnC,IAAI,MAAM,KAAK,IAAI,EAAE;YACnB,OAAO,IAAI,CAAC;SACb;QAED,IAAI,KAAK,KAAK,CAAC,EAAE;YACf,OAAO,MAAM,CAAC;SACf;QAED,IAAI,KAAK,CAAC;QACV,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE;YAC9B,OAAO,MAAM,CAAC;SACf;QAED,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE;YACnB,KAAK,GAAG,EAAE,CAAC;SACZ;aAAM,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE;YAC3B,KAAK,GAAG,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;YAC1D,IAAI,MAAM,CAAC,SAAS,EAAE;gBACpB,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;aACpC;SACF;aAAM,IAAI,MAAM,CAAC,MAAM,CAAC,EAAE;YACzB,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC;SACpC;aAAM;YACL,IAAI,OAAO,SAAS,KAAK,WAAW,EAAE;gBACpC,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;aACtD;iBAAM;gBACL,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;aAClC;SACF;QAED,IAAI,QAAQ,EAAE;YACZ,MAAM,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YAEzC,IAAI,KAAK,KAAK,CAAC,CAAC,EAAE;gBAChB,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;aAC3B;YACD,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACxB,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;SACzB;QAED,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE;YACtB,KAAK,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;SACzC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;AAC/B,CAAC","file":"clone.js","sourcesContent":["import isArray from './isArray';\nimport isDate from './isDate';\nimport isRegExp from './isRegExp';\n\nfunction getRegExpFlags(re: any) {\n let flags = '';\n re.global && (flags += 'g');\n re.ignoreCase && (flags += 'i');\n re.multiline && (flags += 'm');\n return flags;\n}\n\n// Adapted from https://github.com/pvorb/clone by Paul Vorbach\n// License: https://github.com/pvorb/clone/blob/master/LICENSE\nexport default function clone(parent: any, circular = false, depth = 0, prototype: any = undefined) {\n // maintain two arrays for circular references, where corresponding parents\n // and children have the same index\n const allParents: Array<any> = [];\n const allChildren: Array<any> = [];\n\n if (typeof circular === 'undefined') {\n circular = true;\n }\n\n if (typeof depth === 'undefined') {\n depth = Infinity;\n }\n\n // recurse this function so we don't reset allParents and allChildren\n function _clone(parent: any, depth: number) {\n // cloning null always returns null\n if (parent === null) {\n return null;\n }\n\n if (depth === 0) {\n return parent;\n }\n\n let child;\n if (typeof parent !== 'object') {\n return parent;\n }\n\n if (isArray(parent)) {\n child = [];\n } else if (isRegExp(parent)) {\n child = new RegExp(parent.source, getRegExpFlags(parent));\n if (parent.lastIndex) {\n child.lastIndex = parent.lastIndex;\n }\n } else if (isDate(parent)) {\n child = new Date(parent.getTime());\n } else {\n if (typeof prototype === 'undefined') {\n child = Object.create(Object.getPrototypeOf(parent));\n } else {\n child = Object.create(prototype);\n }\n }\n\n if (circular) {\n const index = allParents.indexOf(parent);\n\n if (index !== -1) {\n return allChildren[index];\n }\n allParents.push(parent);\n allChildren.push(child);\n }\n\n for (const i in parent) {\n child[i] = _clone(parent[i], depth - 1);\n }\n\n return child;\n }\n return _clone(parent, depth);\n}\n"]}
|
package/es/common/cloneDeep.js
CHANGED
|
@@ -14,8 +14,11 @@ export default function cloneDeep(value, ignoreWhen, excludeKeys) {
|
|
|
14
14
|
let result;
|
|
15
15
|
if (!isValid(value) || "object" != typeof value || ignoreWhen && ignoreWhen(value)) return value;
|
|
16
16
|
const isArr = isArray(value), length = value.length;
|
|
17
|
+
// 不考虑特殊数组的额外处理
|
|
17
18
|
result = isArr ? new Array(length) : "object" == typeof value ? {} : isBoolean(value) || isNumber(value) || isString(value) ? value : isDate(value) ? new Date(+value) : void 0;
|
|
18
|
-
|
|
19
|
+
// 不考虑 map / set / TypedArray 类型的赋值
|
|
20
|
+
// 不考虑对象的 symbol 属性
|
|
21
|
+
const props = isArr ? void 0 : Object.keys(Object(value));
|
|
19
22
|
let index = -1;
|
|
20
23
|
if (result) for (;++index < (props || value).length; ) {
|
|
21
24
|
const key = props ? props[index] : index, subValue = value[key];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/common/cloneDeep.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,KAAU,EAAE,UAAoC,EAAE,WAAsB;IACxG,IAAI,MAAM,CAAC;IACX,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE;QACrF,OAAO,KAAK,CAAC;KACd;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;
|
|
1
|
+
{"version":3,"sources":["../src/common/cloneDeep.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,WAAW,CAAC;AAChC,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,MAAM,MAAM,UAAU,CAAC;AAC9B,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,QAAQ,MAAM,YAAY,CAAC;AAClC,OAAO,OAAO,MAAM,WAAW,CAAC;AAEhC,MAAM,CAAC,OAAO,UAAU,SAAS,CAAC,KAAU,EAAE,UAAoC,EAAE,WAAsB;IACxG,IAAI,MAAM,CAAC;IACX,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE;QACrF,OAAO,KAAK,CAAC;KACd;IAED,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;IAC7B,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IAC5B,eAAe;IACf,IAAI,KAAK,EAAE;QACT,MAAM,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;KAC5B;IACD,iDAAiD;SAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAClC,MAAM,GAAG,EAAE,CAAC;KACb;IACD,0CAA0C;SACrC,IAAI,SAAS,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE;QAC/D,MAAM,GAAG,KAAK,CAAC;KAChB;SAAM,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;QACxB,MAAM,GAAG,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC;KAC3B;IACD,2EAA2E;SACtE;QACH,MAAM,GAAG,SAAS,CAAC;KACpB;IAED,mCAAmC;IAEnC,mBAAmB;IACnB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAE7D,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;IACf,IAAI,MAAM,EAAE;QACV,OAAO,EAAE,KAAK,GAAG,CAAC,KAAK,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE;YACxC,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACzC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC;YAE5B,IAAI,WAAW,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,EAAE;gBACvD,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC;aACxB;iBAAM;gBACL,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC;aAC5D;SACF;KACF;IACD,OAAO,MAAM,CAAC;AAChB,CAAC","file":"cloneDeep.js","sourcesContent":["import isArray from './isArray';\nimport isBoolean from './isBoolean';\nimport isDate from './isDate';\nimport isNumber from './isNumber';\nimport isString from './isString';\nimport isValid from './isValid';\n\nexport default function cloneDeep(value: any, ignoreWhen?: (value: any) => boolean, excludeKeys?: string[]): any {\n let result;\n if (!isValid(value) || typeof value !== 'object' || (ignoreWhen && ignoreWhen(value))) {\n return value;\n }\n\n const isArr = isArray(value);\n const length = value.length;\n // 不考虑特殊数组的额外处理\n if (isArr) {\n result = new Array(length);\n }\n // 不考虑 buffer / arguments 类型的处理以及 prototype 的额外处理\n else if (typeof value === 'object') {\n result = {};\n }\n // 不建议使用作为 Boolean / Number / String 作为构造器\n else if (isBoolean(value) || isNumber(value) || isString(value)) {\n result = value;\n } else if (isDate(value)) {\n result = new Date(+value);\n }\n // 不考虑 ArrayBuffer / DataView / TypedArray / map / set / regexp / symbol 类型\n else {\n result = undefined;\n }\n\n // 不考虑 map / set / TypedArray 类型的赋值\n\n // 不考虑对象的 symbol 属性\n const props = isArr ? undefined : Object.keys(Object(value));\n\n let index = -1;\n if (result) {\n while (++index < (props || value).length) {\n const key = props ? props[index] : index;\n const subValue = value[key];\n\n if (excludeKeys && excludeKeys.includes(key.toString())) {\n result[key] = subValue;\n } else {\n result[key] = cloneDeep(subValue, ignoreWhen, excludeKeys);\n }\n }\n }\n return result;\n}\n"]}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
function pearson(x, y) {
|
|
2
|
+
let sx = 0, sy = 0;
|
|
3
|
+
for (let i = 0; i < x.length; i++) sx = Math.max(sx, Math.abs(x[i])), sy = Math.max(sy, Math.abs(y[i]));
|
|
4
|
+
if (!sx || !sy) return;
|
|
5
|
+
let mx = 0, my = 0, cx = 0, cy = 0;
|
|
6
|
+
for (let i = 0; i < x.length; i++) {
|
|
7
|
+
const vx = x[i] / sx - cx, vy = y[i] / sy - cy, tx = mx + vx, ty = my + vy;
|
|
8
|
+
cx = tx - mx - vx, cy = ty - my - vy, mx = tx, my = ty;
|
|
9
|
+
}
|
|
10
|
+
mx /= x.length, my /= x.length;
|
|
11
|
+
let xx = 0, yy = 0, xy = 0;
|
|
12
|
+
for (let i = 0; i < x.length; i++) {
|
|
13
|
+
const dx = x[i] / sx - mx, dy = y[i] / sy - my;
|
|
14
|
+
xx += dx * dx, yy += dy * dy, xy += dx * dy;
|
|
15
|
+
}
|
|
16
|
+
if (0 === xx || 0 === yy) return;
|
|
17
|
+
const result = xy / Math.sqrt(xx * yy);
|
|
18
|
+
// 仅修正浮点舍入越过理论端点的几个 ulp。
|
|
19
|
+
return Math.abs(result) > 1 && Math.abs(result) <= 1 + 8 * Number.EPSILON ? Math.sign(result) : result;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function ranks(values) {
|
|
23
|
+
const order = values.map(((value, index) => ({
|
|
24
|
+
value: value,
|
|
25
|
+
index: index
|
|
26
|
+
}))).sort(((a, b) => a.value - b.value)), result = new Array(values.length);
|
|
27
|
+
for (let start = 0; start < order.length; ) {
|
|
28
|
+
let end = start + 1;
|
|
29
|
+
for (;end < order.length && order[end].value === order[start].value; ) end++;
|
|
30
|
+
const rank = (start + end + 1) / 2;
|
|
31
|
+
for (let i = start; i < end; i++) result[order[i].index] = rank;
|
|
32
|
+
start = end;
|
|
33
|
+
}
|
|
34
|
+
return result;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
function kendall(x, y) {
|
|
38
|
+
const pairs = x.map(((value, index) => ({
|
|
39
|
+
x: value,
|
|
40
|
+
y: y[index]
|
|
41
|
+
}))).sort(((a, b) => a.x - b.x || a.y - b.y)), sortedY = [ ...y ].sort(((a, b) => a - b)), yRanks = new Map;
|
|
42
|
+
let tiesY = 0;
|
|
43
|
+
for (let start = 0; start < sortedY.length; ) {
|
|
44
|
+
let end = start + 1;
|
|
45
|
+
for (;end < sortedY.length && sortedY[end] === sortedY[start]; ) end++;
|
|
46
|
+
tiesY += (end - start) * (end - start - 1) / 2, yRanks.set(sortedY[start], yRanks.size + 1),
|
|
47
|
+
start = end;
|
|
48
|
+
}
|
|
49
|
+
const tree = new Float64Array(yRanks.size + 1);
|
|
50
|
+
let tiesX = 0, tiesBoth = 0, discordant = 0;
|
|
51
|
+
for (let start = 0; start < pairs.length; ) {
|
|
52
|
+
let end = start + 1;
|
|
53
|
+
for (;end < pairs.length && pairs[end].x === pairs[start].x; ) end++;
|
|
54
|
+
tiesX += (end - start) * (end - start - 1) / 2;
|
|
55
|
+
for (let i = start; i < end; ) {
|
|
56
|
+
let j = i + 1;
|
|
57
|
+
for (;j < end && pairs[j].y === pairs[i].y; ) j++;
|
|
58
|
+
tiesBoth += (j - i) * (j - i - 1) / 2, i = j;
|
|
59
|
+
}
|
|
60
|
+
// 同 x 组先查询再更新,避免将 x ties 算成逆序。
|
|
61
|
+
for (let i = start; i < end; i++) {
|
|
62
|
+
let lessOrEqual = 0;
|
|
63
|
+
for (let rank = yRanks.get(pairs[i].y); rank > 0; rank -= rank & -rank) lessOrEqual += tree[rank];
|
|
64
|
+
discordant += start - lessOrEqual;
|
|
65
|
+
}
|
|
66
|
+
for (let i = start; i < end; i++) for (let rank = yRanks.get(pairs[i].y); rank < tree.length; rank += rank & -rank) tree[rank]++;
|
|
67
|
+
start = end;
|
|
68
|
+
}
|
|
69
|
+
const total = x.length * (x.length - 1) / 2;
|
|
70
|
+
if (total !== tiesX && total !== tiesY) return (total - tiesX - tiesY + tiesBoth - 2 * discordant) / Math.sqrt((total - tiesX) * (total - tiesY));
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** 等长有限样本的相关系数;常量/不足两条返回 undefined,不修改数组。 */ export function correlation(x, y, method = "pearson") {
|
|
74
|
+
if (x.length !== y.length || ![ "pearson", "spearman", "kendall" ].includes(method) || x.some((value => !Number.isFinite(value))) || y.some((value => !Number.isFinite(value)))) throw new RangeError("correlation requires equal finite arrays and a supported method");
|
|
75
|
+
if (!(x.length < 2)) return "kendall" === method ? kendall(x, y) : "spearman" === method ? pearson(ranks(x), ranks(y)) : pearson(x, y);
|
|
76
|
+
}
|
|
77
|
+
//# sourceMappingURL=correlation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/common/correlation.ts"],"names":[],"mappings":"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","file":"correlation.js","sourcesContent":["export type CorrelationMethod = 'pearson' | 'spearman' | 'kendall';\n\nfunction pearson(x: readonly number[], y: readonly number[]): number | undefined {\n let sx = 0;\n let sy = 0;\n for (let i = 0; i < x.length; i++) {\n sx = Math.max(sx, Math.abs(x[i]));\n sy = Math.max(sy, Math.abs(y[i]));\n }\n if (!sx || !sy) {\n return undefined;\n }\n let mx = 0;\n let my = 0;\n let cx = 0;\n let cy = 0;\n for (let i = 0; i < x.length; i++) {\n const vx = x[i] / sx - cx;\n const vy = y[i] / sy - cy;\n const tx = mx + vx;\n const ty = my + vy;\n cx = tx - mx - vx;\n cy = ty - my - vy;\n mx = tx;\n my = ty;\n }\n mx /= x.length;\n my /= x.length;\n let xx = 0;\n let yy = 0;\n let xy = 0;\n for (let i = 0; i < x.length; i++) {\n const dx = x[i] / sx - mx;\n const dy = y[i] / sy - my;\n xx += dx * dx;\n yy += dy * dy;\n xy += dx * dy;\n }\n if (xx === 0 || yy === 0) {\n return undefined;\n }\n const result = xy / Math.sqrt(xx * yy);\n // 仅修正浮点舍入越过理论端点的几个 ulp。\n if (Math.abs(result) > 1 && Math.abs(result) <= 1 + 8 * Number.EPSILON) {\n return Math.sign(result);\n }\n return result;\n}\n\nfunction ranks(values: readonly number[]): number[] {\n const order = values.map((value, index) => ({ value, index })).sort((a, b) => a.value - b.value);\n const result = new Array<number>(values.length);\n for (let start = 0; start < order.length; ) {\n let end = start + 1;\n while (end < order.length && order[end].value === order[start].value) {\n end++;\n }\n const rank = (start + end + 1) / 2;\n for (let i = start; i < end; i++) {\n result[order[i].index] = rank;\n }\n start = end;\n }\n return result;\n}\n\nfunction kendall(x: readonly number[], y: readonly number[]): number | undefined {\n const pairs = x.map((value, index) => ({ x: value, y: y[index] })).sort((a, b) => a.x - b.x || a.y - b.y);\n const sortedY = [...y].sort((a, b) => a - b);\n const yRanks = new Map<number, number>();\n let tiesY = 0;\n for (let start = 0; start < sortedY.length; ) {\n let end = start + 1;\n while (end < sortedY.length && sortedY[end] === sortedY[start]) {\n end++;\n }\n tiesY += ((end - start) * (end - start - 1)) / 2;\n yRanks.set(sortedY[start], yRanks.size + 1);\n start = end;\n }\n const tree = new Float64Array(yRanks.size + 1);\n let tiesX = 0;\n let tiesBoth = 0;\n let discordant = 0;\n for (let start = 0; start < pairs.length; ) {\n let end = start + 1;\n while (end < pairs.length && pairs[end].x === pairs[start].x) {\n end++;\n }\n tiesX += ((end - start) * (end - start - 1)) / 2;\n for (let i = start; i < end; ) {\n let j = i + 1;\n while (j < end && pairs[j].y === pairs[i].y) {\n j++;\n }\n tiesBoth += ((j - i) * (j - i - 1)) / 2;\n i = j;\n }\n // 同 x 组先查询再更新,避免将 x ties 算成逆序。\n for (let i = start; i < end; i++) {\n let lessOrEqual = 0;\n for (let rank = yRanks.get(pairs[i].y)!; rank > 0; rank -= rank & -rank) {\n lessOrEqual += tree[rank];\n }\n discordant += start - lessOrEqual;\n }\n for (let i = start; i < end; i++) {\n for (let rank = yRanks.get(pairs[i].y)!; rank < tree.length; rank += rank & -rank) {\n tree[rank]++;\n }\n }\n start = end;\n }\n const total = (x.length * (x.length - 1)) / 2;\n if (total === tiesX || total === tiesY) {\n return undefined;\n }\n return (total - tiesX - tiesY + tiesBoth - 2 * discordant) / Math.sqrt((total - tiesX) * (total - tiesY));\n}\n\n/** 等长有限样本的相关系数;常量/不足两条返回 undefined,不修改数组。 */\nexport function correlation(\n x: readonly number[],\n y: readonly number[],\n method: CorrelationMethod = 'pearson'\n): number | undefined {\n if (\n x.length !== y.length ||\n !['pearson', 'spearman', 'kendall'].includes(method) ||\n x.some(value => !Number.isFinite(value)) ||\n y.some(value => !Number.isFinite(value))\n ) {\n throw new RangeError('correlation requires equal finite arrays and a supported method');\n }\n if (x.length < 2) {\n return undefined;\n }\n return method === 'kendall' ? kendall(x, y) : method === 'spearman' ? pearson(ranks(x), ranks(y)) : pearson(x, y);\n}\n"]}
|
package/es/common/debounce.js
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @see https://github.com/lodash/lodash/blob/master/debounce.js
|
|
3
|
+
*/
|
|
1
4
|
import isObject from "./isObject";
|
|
2
5
|
|
|
3
6
|
import isValidNumber from "./isValidNumber";
|
|
@@ -12,6 +15,7 @@ try {
|
|
|
12
15
|
|
|
13
16
|
function debounce(func, wait, options) {
|
|
14
17
|
let lastArgs, lastThis, maxWait, result, timerId, lastCallTime, lastInvokeTime = 0, leading = !1, maxing = !1, trailing = !0;
|
|
18
|
+
// Bypass `requestAnimationFrame` by explicitly setting `wait=0`.
|
|
15
19
|
const useRAF = !wait && 0 !== wait && hasRaf;
|
|
16
20
|
if ("function" != typeof func) throw new TypeError("Expected a function");
|
|
17
21
|
function invokeFunc(time) {
|
|
@@ -24,27 +28,41 @@ function debounce(func, wait, options) {
|
|
|
24
28
|
}
|
|
25
29
|
function shouldInvoke(time) {
|
|
26
30
|
const timeSinceLastCall = time - lastCallTime;
|
|
31
|
+
// Either this is the first call, activity has stopped and we're at the
|
|
32
|
+
// trailing edge, the system time has gone backwards and we're treating
|
|
33
|
+
// it as the trailing edge, or we've hit the `maxWait` limit.
|
|
27
34
|
return void 0 === lastCallTime || timeSinceLastCall >= wait || timeSinceLastCall < 0 || maxing && time - lastInvokeTime >= maxWait;
|
|
28
35
|
}
|
|
29
36
|
function timerExpired() {
|
|
30
37
|
const time = Date.now();
|
|
31
38
|
if (shouldInvoke(time)) return trailingEdge(time);
|
|
32
|
-
|
|
39
|
+
// Restart the timer.
|
|
40
|
+
timerId = startTimer(timerExpired, function(time) {
|
|
33
41
|
const timeSinceLastInvoke = time - lastInvokeTime, timeWaiting = wait - (time - lastCallTime);
|
|
34
42
|
return maxing ? Math.min(timeWaiting, maxWait - timeSinceLastInvoke) : timeWaiting;
|
|
35
43
|
}(time));
|
|
36
44
|
}
|
|
37
45
|
function trailingEdge(time) {
|
|
46
|
+
// Only invoke if we have `lastArgs` which means `func` has been
|
|
47
|
+
// debounced at least once.
|
|
38
48
|
return timerId = void 0, trailing && lastArgs ? invokeFunc(time) : (lastArgs = lastThis = void 0,
|
|
39
49
|
result);
|
|
40
50
|
}
|
|
41
51
|
function debounced(...args) {
|
|
42
52
|
const time = Date.now(), isInvoking = shouldInvoke(time);
|
|
43
|
-
if (lastArgs = args,
|
|
53
|
+
if (lastArgs = args,
|
|
54
|
+
// @ts-ignore
|
|
55
|
+
lastThis = this, lastCallTime = time, isInvoking) {
|
|
44
56
|
if (void 0 === timerId) return function(time) {
|
|
45
|
-
|
|
57
|
+
// Invoke the leading edge.
|
|
58
|
+
// Reset any `maxWait` timer.
|
|
59
|
+
return lastInvokeTime = time,
|
|
60
|
+
// Start the timer for the trailing edge.
|
|
61
|
+
timerId = startTimer(timerExpired, wait), leading ? invokeFunc(time) : result;
|
|
46
62
|
}(lastCallTime);
|
|
47
|
-
if (maxing)
|
|
63
|
+
if (maxing)
|
|
64
|
+
// Handle invocations in a tight loop.
|
|
65
|
+
return timerId = startTimer(timerExpired, wait), invokeFunc(lastCallTime);
|
|
48
66
|
}
|
|
49
67
|
return void 0 === timerId && (timerId = startTimer(timerExpired, wait)), result;
|
|
50
68
|
}
|