{"version":3,"file":"index.umd.cjs","sources":["../src/ArrayUtils.ts","../src/DataTransform.ts","../src/MapUtils.ts","../src/MathUtil.ts","../src/ObjectUtils.ts","../src/Types.ts"],"sourcesContent":["export class ArrayUtils\r\n{\r\n    /**\r\n      * 比较两个数组中元素是否相同\r\n      *\r\n      * @param array 被操作数组\r\n      * @param arr 用于比较的数组\r\n      */\r\n    static equal<T>(array: T[], arr: ArrayLike<T>): boolean\r\n    {\r\n        if (array.length !== arr.length) return false;\r\n        const keys = Object.keys(arr);\r\n        for (let i = 0, n = keys.length; i < n; i++)\r\n        {\r\n            const key = keys[i];\r\n            if (array[key] !== arr[key]) return false;\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * 连接一个或多个数组到自身\r\n     *\r\n     * @param array 被操作数组\r\n     * @param items 要添加到数组末尾的其他项。\r\n     * @returns 返回自身\r\n     */\r\n    static concatToSelf<T>(array: T[], ...items: (T | ConcatArray<T>)[]): T[]\r\n    {\r\n        let arr: T[] = [];\r\n        items.forEach((v) => { arr = arr.concat(v); });\r\n        arr.forEach((v) => array.push(v));\r\n\r\n        return array;\r\n    }\r\n\r\n    /**\r\n     * 使数组变得唯一，不存在两个相等的元素\r\n     *\r\n     * @param array 被操作数组\r\n     * @param compare 比较函数\r\n     */\r\n    static unique<T>(array: T[], compare = (a: T, b: T) => a === b): T[]\r\n    {\r\n        const keys = Object.keys(array);\r\n        const ids = keys.map((v) => Number(v)).filter((v) => !isNaN(v));\r\n        const deleteMap: { [id: number]: true } = {};\r\n        //\r\n        for (let i = 0, n = ids.length; i < n; i++)\r\n        {\r\n            const ki = ids[i];\r\n            if (deleteMap[ki]) continue;\r\n            for (let j = i + 1; j < n; j++)\r\n            {\r\n                const kj = ids[j];\r\n                if (compare(array[ki], array[kj])) deleteMap[kj] = true;\r\n            }\r\n        }\r\n        //\r\n        for (let i = ids.length - 1; i >= 0; i--)\r\n        {\r\n            const id = ids[i];\r\n            if (deleteMap[id]) array.splice(id, 1);\r\n        }\r\n\r\n        return array;\r\n    }\r\n\r\n    /**\r\n     * 使用b元素替换数组中第一个a元素。\r\n     *\r\n     * @param array 被操作数组\r\n     * @param a 被替换的元素\r\n     * @param b 用于替换的元素\r\n     * @param isAdd 当数组中没有找到a元素时，是否需要把b元素添加到数组尾部。默认值为true。\r\n     */\r\n    static replace<T>(array: T[], a: T, b: T, isAdd = true): T[]\r\n    {\r\n        let isreplace = false;\r\n        for (let i = 0; i < array.length; i++)\r\n        {\r\n            if (array[i] === a)\r\n            {\r\n                array[i] = b;\r\n                isreplace = true;\r\n                break;\r\n            }\r\n        }\r\n        if (!isreplace && isAdd) array.push(b);\r\n\r\n        return array;\r\n    }\r\n\r\n    /**\r\n     * 创建数组\r\n     * @param length 长度\r\n     * @param itemFunc 创建元素方法\r\n     */\r\n    static create<T>(length: number, itemFunc: (index: number) => T): T[]\r\n    {\r\n        const arr: T[] = [];\r\n        for (let i = 0; i < length; i++)\r\n        {\r\n            arr[i] = itemFunc(i);\r\n        }\r\n\r\n        return arr;\r\n    }\r\n\r\n    /**\r\n     * 二分查找,如果有多个则返回第一个\r\n     * @param array 数组\r\n     * @param target 寻找的目标\r\n     * @param compare 比较函数\r\n     * @param start 起始位置\r\n     * @param end 结束位置\r\n     * @returns          查找到目标时返回所在位置，否则返回-1\r\n     */\r\n    static binarySearch<T>(array: T[], target: T, compare: (a: T, b: T) => number, start?: number, end?: number): number\r\n    {\r\n        const insert = ArrayUtils.binarySearchInsert(array, target, compare, start, end);\r\n        if (array[insert] === target)\r\n        { return insert; }\r\n\r\n        return -1;\r\n    }\r\n    /**\r\n     * 二分查找插入位置,如果有多个则返回第一个\r\n     * @param array 数组\r\n     * @param target 寻找的目标\r\n     * @param compare 比较函数\r\n     * @param start 起始位置\r\n     * @param end 结束位置\r\n     * @returns          目标所在位置（如果该位置上不是目标对象，则该索引为该目标可插入的位置）\r\n     */\r\n    static binarySearchInsert<T>(array: T[], target: T, compare: (a: T, b: T) => number, start?: number, end?: number): number\r\n    {\r\n        if (start === undefined) start = 0;\r\n        if (end === undefined) end = array.length;\r\n        if (start === end)\r\n        { return start; }\r\n        if (compare(array[start], target) === 0)\r\n        {\r\n            return start;\r\n        }\r\n        const middle = ~~((start + end) / 2);\r\n        if (compare(array[middle], target) < 0)\r\n        {\r\n            start = middle + 1;\r\n        }\r\n        else\r\n        {\r\n            end = middle;\r\n        }\r\n\r\n        return ArrayUtils.binarySearchInsert(array, target, compare, start, end);\r\n    }\r\n\r\n    /**\r\n     * 判断数组是否唯一\r\n     *\r\n     * @param array 被检查数组\r\n     * @param compare 比较函数\r\n     */\r\n    static isUnique<T>(array: T[], compare = (a: T, b: T) => a === b): boolean\r\n    {\r\n        for (let i = array.length - 1; i >= 0; i--)\r\n        {\r\n            for (let j = 0; j < i; j++)\r\n            {\r\n                if (compare(array[i], array[j]))\r\n                {\r\n                    return false;\r\n                }\r\n            }\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * 删除元素\r\n     *\r\n     * @param array 被操作数组\r\n     * @param item 被删除元素\r\n     * @returns 被删除元素在数组中的位置\r\n     */\r\n    static deleteItem<T>(array: T[], item: T): number\r\n    {\r\n        const index = array.indexOf(item);\r\n        if (index !== -1) array.splice(index, 1);\r\n\r\n        return index;\r\n    }\r\n}\r\n\r\n","/**\r\n * 数据类型转换\r\n * TypeArray、ArrayBuffer、Blob、File、DataURL、canvas的相互转换\r\n * @see http://blog.csdn.net/yinwhm12/article/details/73482904\r\n */\r\nexport class DataTransform\r\n{\r\n    /**\r\n     * Blob to ArrayBuffer\r\n     */\r\n    async blobToArrayBuffer(blob: Blob)\r\n    {\r\n        const arrayBuffer: ArrayBuffer = await new Promise((resolve) =>\r\n        {\r\n            const reader = new FileReader();\r\n            reader.onload = function (e)\r\n            {\r\n                resolve(e.target.result as ArrayBuffer);\r\n            };\r\n            reader.readAsArrayBuffer(blob);\r\n        });\r\n\r\n        return arrayBuffer;\r\n    }\r\n\r\n    /**\r\n     * ArrayBuffer to Blob\r\n     */\r\n    arrayBufferToBlob(arrayBuffer: ArrayBuffer)\r\n    {\r\n        const blob = new Blob([arrayBuffer]); // 注意必须包裹[]\r\n\r\n        return blob;\r\n    }\r\n\r\n    /**\r\n     * ArrayBuffer to Uint8\r\n     * Uint8数组可以直观的看到ArrayBuffer中每个字节（1字节 === 8位）的值。一般我们要将ArrayBuffer转成Uint类型数组后才能对其中的字节进行存取操作。\r\n     */\r\n    arrayBufferToUint8(arrayBuffer: ArrayBuffer)\r\n    {\r\n        const u8 = new Uint8Array(arrayBuffer);\r\n\r\n        return u8;\r\n    }\r\n\r\n    /**\r\n     * Uint8 to ArrayBuffer\r\n     * 我们Uint8数组可以直观的看到ArrayBuffer中每个字节（1字节 === 8位）的值。一般我们要将ArrayBuffer转成Uint类型数组后才能对其中的字节进行存取操作。\r\n     */\r\n    uint8ToArrayBuffer(uint8Array: Uint8Array)\r\n    {\r\n        const buffer = uint8Array.buffer as ArrayBuffer;\r\n\r\n        return buffer;\r\n    }\r\n\r\n    /**\r\n     * Array to ArrayBuffer\r\n     * @param array 例如：[0x15, 0xFF, 0x01, 0x00, 0x34, 0xAB, 0x11];\r\n     */\r\n    arrayToArrayBuffer(array: number[])\r\n    {\r\n        const uint8 = new Uint8Array(array);\r\n        const buffer = uint8.buffer as ArrayBuffer;\r\n\r\n        return buffer;\r\n    }\r\n\r\n    /**\r\n     * TypeArray to Array\r\n     */\r\n    uint8ArrayToArray(u8a: Uint8Array)\r\n    {\r\n        const arr: number[] = [];\r\n        for (let i = 0; i < u8a.length; i++)\r\n        {\r\n            arr.push(u8a[i]);\r\n        }\r\n\r\n        return arr;\r\n    }\r\n\r\n    /**\r\n     * canvas转换为dataURL\r\n     */\r\n    canvasToDataURL(canvas: HTMLCanvasElement, type: 'png' | 'jpeg' = 'png', quality = 1)\r\n    {\r\n        if (type === 'png') return canvas.toDataURL('image/png');\r\n\r\n        return canvas.toDataURL('image/jpeg', quality);\r\n    }\r\n\r\n    /**\r\n     * canvas转换为图片\r\n     */\r\n    async canvasToImage(canvas: HTMLCanvasElement, type: 'png' | 'jpeg' = 'png', quality = 1)\r\n    {\r\n        const dataURL = this.canvasToDataURL(canvas, type, quality);\r\n        const img = await this.dataURLToImage(dataURL);\r\n\r\n        return img;\r\n    }\r\n\r\n    /**\r\n     * File、Blob对象转换为dataURL\r\n     * File对象也是一个Blob对象，二者的处理相同。\r\n     */\r\n    async blobToDataURL(blob: Blob)\r\n    {\r\n        const dataURL: string = await new Promise((resolve) =>\r\n        {\r\n            const a = new FileReader();\r\n            a.onload = function (e)\r\n            {\r\n                resolve(e.target.result as any);\r\n            };\r\n            a.readAsDataURL(blob);\r\n        });\r\n\r\n        return dataURL;\r\n    }\r\n\r\n    /**\r\n     * dataURL转换为Blob对象\r\n     */\r\n    dataURLtoBlob(dataurl: string)\r\n    {\r\n        const arr = dataurl.split(','); const mime = (arr[0].match(/:(.*?);/))[1];\r\n        const bstr = atob(arr[1]); let n = bstr.length; const\r\n            u8arr = new Uint8Array(n);\r\n        while (n--)\r\n        {\r\n            u8arr[n] = bstr.charCodeAt(n);\r\n        }\r\n        const blob = new Blob([u8arr], { type: mime });\r\n\r\n        return blob;\r\n    }\r\n\r\n    async dataURLToArrayBuffer(dataurl: string)\r\n    {\r\n        const blob = this.dataURLtoBlob(dataurl);\r\n        const arrayBuffer = await this.blobToArrayBuffer(blob);\r\n\r\n        return arrayBuffer;\r\n    }\r\n\r\n    async arrayBufferToDataURL(arrayBuffer: ArrayBuffer)\r\n    {\r\n        const blob = this.arrayBufferToBlob(arrayBuffer);\r\n        const dataURL = await this.blobToDataURL(blob);\r\n\r\n        return dataURL;\r\n    }\r\n\r\n    async dataURLToImage(dataurl: string)\r\n    {\r\n        const img: HTMLImageElement = await new Promise((resolve) =>\r\n        {\r\n            const img = new Image();\r\n            img.onload = function ()\r\n            {\r\n                resolve(img);\r\n            };\r\n            img.src = dataurl;\r\n        });\r\n\r\n        return img;\r\n    }\r\n\r\n    imageToDataURL(img: HTMLImageElement, quality = 1)\r\n    {\r\n        const canvas = this.imageToCanvas(img);\r\n        const dataurl = this.canvasToDataURL(canvas, 'png', quality);\r\n\r\n        return dataurl;\r\n    }\r\n\r\n    imageToCanvas(img: HTMLImageElement)\r\n    {\r\n        const canvas = document.createElement('canvas');\r\n        canvas.width = img.width;\r\n        canvas.height = img.height;\r\n        const ctxt = canvas.getContext('2d');\r\n        ctxt.drawImage(img, 0, 0);\r\n\r\n        return canvas;\r\n    }\r\n\r\n    async imageToArrayBuffer(img: HTMLImageElement)\r\n    {\r\n        let arraybuffer = imageBufferMap.get(img);\r\n        if (arraybuffer)\r\n        {\r\n            return arraybuffer;\r\n        }\r\n        const dataUrl = this.imageToDataURL(img);\r\n        arraybuffer = await this.dataURLToArrayBuffer(dataUrl);\r\n        imageBufferMap.set(img, arraybuffer);\r\n        bufferImageMap.set(arraybuffer, img);\r\n\r\n        return arraybuffer;\r\n    }\r\n\r\n    imageDataToDataURL(imageData: ImageData, quality = 1)\r\n    {\r\n        const canvas = this.imageDataToCanvas(imageData);\r\n        const dataurl = this.canvasToDataURL(canvas, 'png', quality);\r\n\r\n        return dataurl;\r\n    }\r\n\r\n    imageDataToCanvas(imageData: ImageData)\r\n    {\r\n        const canvas = document.createElement('canvas');\r\n        canvas.width = imageData.width;\r\n        canvas.height = imageData.height;\r\n        const ctxt = canvas.getContext('2d');\r\n        ctxt.putImageData(imageData, 0, 0);\r\n\r\n        return canvas;\r\n    }\r\n\r\n    async imagedataToImage(imageData: ImageData, quality = 1)\r\n    {\r\n        const dataUrl = this.imageDataToDataURL(imageData, quality);\r\n        const img = await this.dataURLToImage(dataUrl);\r\n\r\n        return img;\r\n    }\r\n\r\n    async arrayBufferToImage(arrayBuffer: ArrayBuffer)\r\n    {\r\n        let img = bufferImageMap.get(arrayBuffer);\r\n        if (img)\r\n        {\r\n            return img;\r\n        }\r\n\r\n        const dataurl = await this.arrayBufferToDataURL(arrayBuffer);\r\n        img = await this.dataURLToImage(dataurl);\r\n        bufferImageMap.set(arrayBuffer, img);\r\n        imageBufferMap.set(img, arrayBuffer);\r\n\r\n        return img;\r\n    }\r\n\r\n    async blobToText(blob: Blob)\r\n    {\r\n        const content: string = await new Promise((resolve) =>\r\n        {\r\n            const a = new FileReader();\r\n            a.onload = function (e) { resolve(e.target.result as any); };\r\n            a.readAsText(blob);\r\n        });\r\n\r\n        return content;\r\n    }\r\n\r\n    stringToArrayBuffer(str: string)\r\n    {\r\n        const uint8Array = this.stringToUint8Array(str);\r\n        const buffer = this.uint8ToArrayBuffer(uint8Array);\r\n\r\n        return buffer;\r\n    }\r\n\r\n    async arrayBufferToString(arrayBuffer: ArrayBuffer)\r\n    {\r\n        const blob = this.arrayBufferToBlob(arrayBuffer);\r\n        const content = await this.blobToText(blob);\r\n\r\n        return content;\r\n    }\r\n\r\n    /**\r\n     * ArrayBuffer 转换为 对象\r\n     *\r\n     * @param arrayBuffer\r\n     */\r\n    async arrayBufferToObject(arrayBuffer: ArrayBuffer)\r\n    {\r\n        const str = await this.arrayBufferToString(arrayBuffer);\r\n        const obj = JSON.parse(str);\r\n\r\n        return obj;\r\n    }\r\n\r\n    stringToUint8Array(str: string)\r\n    {\r\n        const utf8 = unescape(encodeURIComponent(str));\r\n        const uint8Array = new Uint8Array(utf8.split('').map(function (item)\r\n        {\r\n            return item.charCodeAt(0);\r\n        }));\r\n\r\n        return uint8Array;\r\n    }\r\n\r\n    uint8ArrayToString(arr: Uint8Array)\r\n    {\r\n        // or [].slice.apply(arr)\r\n        // var utf8 = Array.from(arr).map(function (item)\r\n        const utf8 = [].slice.apply(arr).map(function (item)\r\n        {\r\n            return String.fromCharCode(item);\r\n        }).join('');\r\n\r\n        const str = decodeURIComponent(escape(utf8));\r\n\r\n        return str;\r\n    }\r\n}\r\n\r\n/**\r\n * 数据类型转换\r\n * TypeArray、ArrayBuffer、Blob、File、DataURL、canvas的相互转换\r\n * @see http://blog.csdn.net/yinwhm12/article/details/73482904\r\n */\r\nexport const dataTransform = new DataTransform();\r\n\r\nconst imageBufferMap = new WeakMap<HTMLImageElement, ArrayBuffer>();\r\nconst bufferImageMap = new WeakMap<ArrayBuffer, HTMLImageElement>();\r\n","export class MapUtils\r\n{\r\n    static getKeys<K, V>(map: Map<K, V>): K[]\r\n    {\r\n        const keys: any[] = [];\r\n        map.forEach((_v, k) =>\r\n        {\r\n            keys.push(k);\r\n        });\r\n\r\n        return keys;\r\n    }\r\n\r\n    static getValues<K, V>(map: Map<K, V>): V[]\r\n    {\r\n        const values: any[] = [];\r\n        map.forEach((v, _k) =>\r\n        {\r\n            values.push(v);\r\n        });\r\n\r\n        return values;\r\n    }\r\n}\r\n","export class MathUtil\r\n{\r\n    /**\r\n     * 角度转弧度因子\r\n     */\r\n    DEG2RAD = Math.PI / 180;\r\n\r\n    /**\r\n     * 弧度转角度因子\r\n     */\r\n    RAD2DEG = 180 / Math.PI;\r\n\r\n    /**\r\n     * 默认精度\r\n     */\r\n    PRECISION = 1e-6;\r\n\r\n    /**\r\n     * 获取唯一标识符\r\n     * @see http://www.broofa.com/Tools/Math.uuid.htm\r\n     */\r\n    uuid = (function uuid(length = 36)\r\n    {\r\n        const chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split('');\r\n        const id = new Array(length);\r\n        let rnd = 0; let\r\n            r = 0;\r\n\r\n        return function generateUUID()\r\n        {\r\n            for (let i = 0; i < length; i++)\r\n            {\r\n                if (i === 8 || i === 13 || i === 18 || i === 23)\r\n                {\r\n                    id[i] = '-';\r\n                }\r\n                else if (i === 14)\r\n                {\r\n                    id[i] = '4';\r\n                }\r\n                else\r\n                {\r\n                    if (rnd <= 0x02) rnd = 0x2000000 + (Math.random() * 0x1000000) | 0;\r\n                    r = rnd & 0xf;\r\n                    rnd = rnd >> 4;\r\n                    id[i] = chars[(i === 19) ? (r & 0x3) | 0x8 : r];\r\n                }\r\n            }\r\n\r\n            return id.join('');\r\n        };\r\n    })();\r\n\r\n    /**\r\n     * （夹紧）计算指定值到区间[edge0 ,edge1]最近的值\r\n     *\r\n     * @param value 指定值\r\n     * @param lowerLimit 区间下界\r\n     * @param upperLimit 区间上界\r\n     */\r\n    clamp(value: number, lowerLimit: number, upperLimit: number)\r\n    {\r\n        if ((value - lowerLimit) * (value - upperLimit) <= 0) return value;\r\n        if (value < lowerLimit) return lowerLimit < upperLimit ? lowerLimit : upperLimit;\r\n\r\n        return lowerLimit > upperLimit ? lowerLimit : upperLimit;\r\n    }\r\n\r\n    /**\r\n     * 计算欧几里得模（整数模） ((n % m) + m) % m\r\n     *\r\n     * @param n 被除数\r\n     * @param m 除数\r\n     * @see https://en.wikipedia.org/wiki/Modulo_operation\r\n     */\r\n    euclideanModulo(n: number, m: number)\r\n    {\r\n        return ((n % m) + m) % m;\r\n    }\r\n\r\n    /**\r\n     * 使 x 值从区间 <a1, a2> 线性映射到区间 <b1, b2>\r\n     *\r\n     * @param x 第一个区间中值\r\n     * @param a1 第一个区间起始值\r\n     * @param a2 第一个区间终止值\r\n     * @param b1 第二个区间起始值\r\n     * @param b2 第二个区间起始值\r\n     */\r\n    mapLinear(x: number, a1: number, a2: number, b1: number, b2: number)\r\n    {\r\n        return b1 + (x - a1) * (b2 - b1) / (a2 - a1);\r\n    }\r\n\r\n    /**\r\n     * 线性插值\r\n     *\r\n     * @param start 起始值\r\n     * @param end 终止值\r\n     * @param t 插值系数 [0 ,1]\r\n     *\r\n     * @see https://en.wikipedia.org/wiki/Linear_interpolation\r\n     */\r\n    lerp(start: number, end: number, t: number)\r\n    {\r\n        return (1 - t) * start + t * end;\r\n    }\r\n\r\n    /**\r\n     * 计算平滑值 3x^2 - 2x^3\r\n     *\r\n     * @param x\r\n     * @param min 最小值\r\n     * @param max 最大值\r\n     *\r\n     * @see http://en.wikipedia.org/wiki/Smoothstep\r\n     */\r\n    smoothstep(x: number, min: number, max: number)\r\n    {\r\n        if (x <= min) return 0;\r\n        if (x >= max) return 1;\r\n\r\n        x = (x - min) / (max - min);\r\n\r\n        return x * x * (3 - 2 * x);\r\n    }\r\n\r\n    /**\r\n     * 从<low, high>获取随机整数\r\n     *\r\n     * @param low 区间起始值\r\n     * @param high 区间终止值\r\n     */\r\n    randInt(low: number, high: number)\r\n    {\r\n        return low + Math.floor(Math.random() * (high - low + 1));\r\n    }\r\n\r\n    /**\r\n     * 从<low, high>获取随机浮点数\r\n     *\r\n     * @param low 区间起始值\r\n     * @param high 区间终止值\r\n     */\r\n    randFloat(low: number, high: number)\r\n    {\r\n        return low + Math.random() * (high - low);\r\n    }\r\n\r\n    /**\r\n     * 从<-range/2, range/2>获取随机浮点数\r\n     *\r\n     * @param range 范围\r\n     */\r\n    randFloatSpread(range: number)\r\n    {\r\n        return range * (0.5 - Math.random());\r\n    }\r\n\r\n    /**\r\n     * 角度转换为弧度\r\n     *\r\n     * @param degrees 角度\r\n     */\r\n    degToRad(degrees: number)\r\n    {\r\n        return degrees * this.DEG2RAD;\r\n    }\r\n\r\n    /**\r\n     * 弧度转换为角度\r\n     *\r\n     * @param radians 弧度\r\n     */\r\n    radToDeg(radians: number)\r\n    {\r\n        return radians * this.RAD2DEG;\r\n    }\r\n\r\n    /**\r\n     * 判断指定整数是否为2的幂\r\n     *\r\n     * @param value 整数\r\n     */\r\n    isPowerOfTwo(value: number)\r\n    {\r\n        return (value & (value - 1)) === 0 && value !== 0;\r\n    }\r\n\r\n    /**\r\n     * 获取离指定整数最近的2的幂\r\n     *\r\n     * @param value 整数\r\n     */\r\n    nearestPowerOfTwo(value: number)\r\n    {\r\n        return Math.pow(2, Math.round(Math.log(value) / Math.LN2));\r\n    }\r\n\r\n    /**\r\n     * 获取指定大于等于整数最小2的幂，3->4,5->8,17->32,33->64\r\n     *\r\n     * @param value 整数\r\n     */\r\n    nextPowerOfTwo(value: number)\r\n    {\r\n        value--;\r\n        value |= value >> 1;\r\n        value |= value >> 2;\r\n        value |= value >> 4;\r\n        value |= value >> 8;\r\n        value |= value >> 16;\r\n        value++;\r\n\r\n        return value;\r\n    }\r\n\r\n    /**\r\n     * 获取目标最近的值\r\n     *\r\n     * source增加或者减少整数倍precision后得到离target最近的值\r\n     *\r\n     * ```\r\n     * mathUtil.toRound(71,0,5);//运算结果为1\r\n     * ```\r\n     *\r\n     * @param source 初始值\r\n     * @param target 目标值\r\n     * @param precision 精度\r\n     */\r\n    toRound(source: number, target: number, precision = 360)\r\n    {\r\n        return source + Math.round((target - source) / precision) * precision;\r\n    }\r\n\r\n    /**\r\n     * 比较两个Number是否相等\r\n     *\r\n     * @param a 数字a\r\n     * @param b 数字b\r\n     * @param precision 进度\r\n     */\r\n    equals(a: number, b: number, precision?: number)\r\n    {\r\n        if (precision === undefined)\r\n        { precision = this.PRECISION; }\r\n\r\n        return Math.abs(a - b) < precision;\r\n    }\r\n\r\n    /**\r\n     * 计算最大公约数\r\n     *\r\n     * @param a 整数a\r\n     * @param b 整数b\r\n     *\r\n     * @see https://en.wikipedia.org/wiki/Greatest_common_divisor\r\n     */\r\n    gcd(a: number, b: number)\r\n    {\r\n        // eslint-disable-next-line no-empty\r\n        if (b) while ((a %= b) && (b %= a)) { }\r\n\r\n        return a + b;\r\n    }\r\n\r\n    /**\r\n     * 计算最小公倍数\r\n     * Least common multiple\r\n     *\r\n     * @param a 整数a\r\n     * @param b 整数b\r\n     *\r\n     * @see https://en.wikipedia.org/wiki/Least_common_multiple\r\n     */\r\n    lcm(a: number, b: number)\r\n    {\r\n        return a * b / this.gcd(a, b);\r\n    }\r\n}\r\n\r\nexport const mathUtil = new MathUtil();\r\n","import { ArrayUtils } from './ArrayUtils';\r\nimport { gPartial } from './Types';\r\n\r\n/**\r\n * ObjectUtils.assignDeep 中 转换结果的函数定义\r\n */\r\ninterface AssignDeepHandler\r\n{\r\n    /**\r\n     *\r\n     * @param target 目标对象\r\n     * @param source 源数据\r\n     * @param key 属性名称\r\n     * @param replacers 转换函数\r\n     * @param deep 当前深度\r\n     */\r\n    (target: any, source: any, key: string, replacers: AssignDeepHandler[], deep: number): boolean;\r\n}\r\n\r\nexport class ObjectUtils\r\n{\r\n    /**\r\n     * 判断是否为基础类型 undefined,null,boolean,string,number\r\n     */\r\n    static isBaseType(object: any): boolean\r\n    {\r\n        // 基础类型\r\n        if (\r\n            object === undefined || object === null\r\n            || typeof object === 'boolean'\r\n            || typeof object === 'string'\r\n            || typeof object === 'number'\r\n        )\r\n        { return true; }\r\n\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * 执行方法\r\n     *\r\n     * 用例：\r\n     * 1. 给一个新建的对象进行初始化\r\n     *\r\n     *  ``` startLifetime = ObjectUtils.runFunc(new MinMaxCurve(), (obj) => { obj.mode = MinMaxCurveMode.Constant; (<MinMaxCurveConstant>obj.minMaxCurve).value = 5; }); ```\r\n     *\r\n     * @param obj 对象\r\n     * @param func 被执行的方法\r\n     */\r\n    static runFunc<T>(obj: T, func: (obj: T) => void): T\r\n    {\r\n        func(obj);\r\n\r\n        return obj;\r\n    }\r\n\r\n    /**\r\n     * 判断是否为Object对象，构造函数是否为Object， 检测 ObjectUtils.constructor === Object\r\n     *\r\n     * @param object 用于判断的对象\r\n     */\r\n    static isObject(object: any): boolean\r\n    {\r\n        return object?.constructor.name === 'Object';\r\n    }\r\n\r\n    /**\r\n     * 获取对象对应属性上的值\r\n     *\r\n     * @param object 对象\r\n     * @param property 属性名称，可以是 \"a\" 或者 \"a.b\" 或者 [\"a\",\"b\"]\r\n     */\r\n    static getPropertyValue(object: any, property: string | string[]): any\r\n    {\r\n        if (typeof property === 'string') property = property.split('.');\r\n        let value = object;\r\n        const len = property.length;\r\n        for (let i = 0; i < len; i++)\r\n        {\r\n            if (ObjectUtils.objectIsEmpty(value)) return undefined;\r\n            value = value[property[i]];\r\n        }\r\n\r\n        return value;\r\n    }\r\n\r\n    /**\r\n     * 获取对象上属性链列表\r\n     *\r\n     * 例如 object值为{ a: { b: { c: 1 }, d: 2 } }时则返回 [\"a.b.c\",\"a.d\"]\r\n     *\r\n     * @param object 对象\r\n     */\r\n    static getPropertyChains(object: any): string[]\r\n    {\r\n        const result: string[] = [];\r\n        // 属性名称列表\r\n        const propertys = Object.keys(object);\r\n        // 属性所属对象列表\r\n        const hosts = new Array(propertys.length).fill(object);\r\n        // 父属性所在编号列表\r\n        const parentPropertyIndices = new Array(propertys.length).fill(-1);\r\n        // 处理到的位置\r\n        let index = 0;\r\n        while (index < propertys.length)\r\n        {\r\n            const host = hosts[index];\r\n            const cp = propertys[index];\r\n            const cv = host[cp];\r\n            let vks: string[];\r\n            if (ObjectUtils.objectIsEmpty(cv) || ObjectUtils.isBaseType(cv) || (vks = Object.keys(cv)).length === 0)\r\n            {\r\n                // 处理叶子属性\r\n                const ps = [cp];\r\n                let ci = index;\r\n                // 查找并组合属性链\r\n                while ((ci = parentPropertyIndices[ci]) !== -1)\r\n                {\r\n                    ps.push(propertys[ci]);\r\n                }\r\n                ps.reverse();\r\n                result.push(ps.join('.'));\r\n            }\r\n            else\r\n            {\r\n                // 处理中间属性\r\n                // eslint-disable-next-line no-loop-func\r\n                vks.forEach((k) =>\r\n                {\r\n                    propertys.push(k);\r\n                    hosts.push(cv);\r\n                    parentPropertyIndices.push(index);\r\n                });\r\n            }\r\n\r\n            index++;\r\n        }\r\n\r\n        return result;\r\n    }\r\n\r\n    /**\r\n     * 浅赋值\r\n     * 从源数据取所有可枚举属性值赋值给目标对象\r\n     *\r\n     * @param target 目标对象\r\n     * @param source 源数据\r\n     */\r\n    static assignShallow<T>(target: T, source: Partial<T>): T\r\n    {\r\n        if (ObjectUtils.objectIsEmpty(source)) return target;\r\n        const keys = Object.keys(source);\r\n        keys.forEach((k) =>\r\n        {\r\n            target[k] = source[k];\r\n        });\r\n\r\n        return target;\r\n    }\r\n\r\n    /**\r\n     * 深度赋值\r\n     * 从源数据取所有子代可枚举属性值赋值给目标对象\r\n     *\r\n     * @param target 被赋值对象\r\n     * @param source 源数据\r\n     * @param handlers 处理函数列表，先于 ObjectUtils.assignDeepDefaultHandlers 执行。函数返回值为true表示该属性赋值已完成跳过默认属性赋值操作，否则执行默认属性赋值操作。执行在 ObjectUtils.DefaultAssignDeepReplacers 前。\r\n     * @param deep 赋值深度，deep<1时直接返回。\r\n     */\r\n    static assignDeep<T>(target: T, source: gPartial<T>, handlers: AssignDeepHandler[] = [], deep = Number.MAX_SAFE_INTEGER): T\r\n    {\r\n        if (ObjectUtils.objectIsEmpty(source)) return target;\r\n        if (deep < 1) return target;\r\n        const keys = Object.keys(source);\r\n        const concatHandlers = handlers.concat(ObjectUtils.assignDeepDefaultHandlers);\r\n        keys.forEach((k) =>\r\n        {\r\n            //\r\n            for (let i = 0; i < concatHandlers.length; i++)\r\n            {\r\n                if (concatHandlers[i](target, source, k, handlers, deep))\r\n                {\r\n                    return;\r\n                }\r\n            }\r\n            //\r\n            target[k] = source[k];\r\n        });\r\n\r\n        return target;\r\n    }\r\n\r\n    /**\r\n     * 深度比较两个对象子代可枚举属性值\r\n     *\r\n     * @param a 第一个对象\r\n     * @param b 第二个对象\r\n     */\r\n    static equalDeep<T>(a: T, b: T): boolean\r\n    {\r\n        if (a === b) return true;\r\n        if (ObjectUtils.isBaseType(a) || ObjectUtils.isBaseType(b)) return a === b;\r\n        if (typeof a === 'function' || typeof b === 'function') return a === b;\r\n        //\r\n        const akeys = Object.keys(a);\r\n        const bkeys = Object.keys(b);\r\n        if (!ArrayUtils.equal(akeys, bkeys)) return false;\r\n        if (Array.isArray(a) && Array.isArray(b)) return a.length === b.length;\r\n        // 检测所有属性\r\n        for (let i = 0; i < akeys.length; i++)\r\n        {\r\n            const element = akeys[i];\r\n            if (!ObjectUtils.equalDeep(a[element], b[element]))\r\n            {\r\n                return false;\r\n            }\r\n        }\r\n\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * 判断对象是否为null或者undefine\r\n     *\r\n     * @param obj\r\n     * @returns\r\n     */\r\n    static objectIsEmpty(obj: any)\r\n    {\r\n        return (obj === undefined || obj === null);\r\n    }\r\n\r\n    /**\r\n     * 从对象自身或者对象的原型中获取属性描述\r\n     *\r\n     * @param object 对象\r\n     * @param property 属性名称\r\n     */\r\n    static getPropertyDescriptor(object: any, property: string): PropertyDescriptor | undefined\r\n    {\r\n        const data = Object.getOwnPropertyDescriptor(object, property);\r\n        if (data)\r\n        {\r\n            return data;\r\n        }\r\n        const prototype = Object.getPrototypeOf(object);\r\n        if (prototype)\r\n        {\r\n            return ObjectUtils.getPropertyDescriptor(prototype, property);\r\n        }\r\n\r\n        return undefined;\r\n    }\r\n\r\n    /**\r\n     * 属性是否可写\r\n     * @param obj 对象\r\n     * @param property 属性名称\r\n     */\r\n    static propertyIsWritable(obj: any, property: string): boolean\r\n    {\r\n        const data = ObjectUtils.getPropertyDescriptor(obj, property);\r\n        if (!data) return false;\r\n        if (data.get && !data.set) return false;\r\n\r\n        return true;\r\n    }\r\n\r\n    /**\r\n     * ObjectUtils.assignDeep 中 默认转换结果的函数列表\r\n     */\r\n    static assignDeepDefaultHandlers: AssignDeepHandler[] = [\r\n        function (target, source, key)\r\n        {\r\n            if (target[key] === source[key]) return true;\r\n\r\n            return false;\r\n        },\r\n        function (target, source, key)\r\n        {\r\n            if (ObjectUtils.isBaseType(target[key]) || ObjectUtils.isBaseType(source[key]))\r\n            {\r\n                target[key] = source[key];\r\n\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        },\r\n        function (target, source, key, handlers, deep)\r\n        {\r\n            if (Array.isArray(source[key]) || ObjectUtils.isObject(source[key]))\r\n            {\r\n                ObjectUtils.assignDeep(target[key], source[key], handlers, deep - 1);\r\n\r\n                return true;\r\n            }\r\n\r\n            return false;\r\n        },\r\n    ];\r\n}\r\n","/**\r\n * 构造函数\r\n *\r\n * @example\r\n * ```\r\n * const Vector2Constructor: Constructor<Vector2> = Vector2;\r\n * ```\r\n */\r\nexport type Constructor<T = any> = (new (...args: any[]) => T);\r\n\r\n/**\r\n * 映射每个属性的类定义\r\n *\r\n * @example\r\n * ```\r\n * const classmap: ConstructorOf<{ Vector2: Vector2 }> = { Vector2: Vector2 };\r\n * ```\r\n */\r\nexport type ConstructorOf<T> = { [P in keyof T]: Constructor<T[P]>; };\r\n\r\n/**\r\n * 让T中以及所有键值中的所有键都是可选的\r\n */\r\nexport type gPartial<T> = {\r\n    [P in keyof T]?: T[P] | gPartial<T[P]>;\r\n};\r\n\r\n/**\r\n * 获取T类型中除值为KT类型以外的所有键\r\n *\r\n * ```\r\n * class A\r\n * {\r\n *      a = 1;\r\n *      f(){}\r\n * }\r\n *\r\n * var a: NonTypePropertyNames<A, number>; //var a:\"f\"\r\n * var a1: NonTypePropertyNames<A, Function>; //var a:\"a\"\r\n *\r\n * ```\r\n */\r\nexport type NonTypePropertyNames<T, KT> = { [K in keyof T]: T[K] extends KT ? never : K }[keyof T];\r\n\r\n/**\r\n * 剔除T类型中值为KT类型的键\r\n * ```\r\n *     class A\r\n *     {\r\n *         a = 1;\r\n *         f(){}\r\n *     }\r\n *\r\n *     var a: NonTypePropertys<A, number>; //var a: Pick<A, \"f\">\r\n *     var a1: NonTypePropertys<A, Function>; //var a1: Pick<A, \"a\">\r\n * ```\r\n */\r\nexport type NonTypePropertys<T, KT> = Pick<T, NonTypePropertyNames<T, KT>>;\r\n\r\n/**\r\n * 选取T类型中值为KT类型的所有键\r\n *\r\n * ```\r\n *     class A\r\n *     {\r\n *         a = 1;\r\n *         f(){}\r\n *     }\r\n *\r\n *     var a: TypePropertyNames<A, number>; //var a: \"a\"\r\n *     var a1: TypePropertyNames<A, Function>; //var a1: \"f\"\r\n * ```\r\n */\r\nexport type TypePropertyNames<T, KT> = { [K in keyof T]: T[K] extends KT ? K : never }[keyof T];\r\n\r\n/**\r\n * 选取T类型中值为非函数类型的所有键\r\n */\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\nexport type PropertyNames<T> = NonTypePropertyNames<T, Function>;\r\n\r\n/**\r\n * 选取T类型中值为函数的所有键\r\n *\r\n * ```\r\n *     class A\r\n *     {\r\n *         a = 1;\r\n *         f(){}\r\n *     }\r\n *\r\n *     var a: FunctionPropertyNames<A>; //var a: \"f\"\r\n * ```\r\n */\r\n// eslint-disable-next-line @typescript-eslint/ban-types\r\nexport type FunctionPropertyNames<T> = TypePropertyNames<T, Function>;\r\n\r\n/**\r\n * 选取T类型中值为KT类型的键\r\n *\r\n * ```\r\n *     class A\r\n *     {\r\n *         a = 1;\r\n *         f() { }\r\n *     }\r\n *\r\n *     var a: TypePropertys<A, number>; //var a: Pick<A, \"a\">\r\n *     var a1: TypePropertys<A, Function>; //var a1: Pick<A, \"f\">\r\n * ```\r\n */\r\nexport type TypePropertys<T, KT> = Pick<T, TypePropertyNames<T, KT>>;\r\n\r\nexport type Lazy<T> = T | ((...args: any[]) => T);\r\n\r\nexport type LazyObject<T> = { [P in keyof T]: Lazy<T[P]>; };\r\n\r\nexport const lazy = {\r\n    getValue<T>(lazyItem: Lazy<T>, ...args: any[]): T\r\n    {\r\n        if (typeof lazyItem === 'function')\r\n        {\r\n            // eslint-disable-next-line prefer-spread\r\n            return (lazyItem as Function).apply(undefined, args);\r\n        }\r\n\r\n        return lazyItem;\r\n    }\r\n};\r\n"],"names":["img"],"mappings":"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"}