{"version":3,"file":"index.umd.production.min.cjs","sources":["../src/util.ts","../src/index.ts"],"sourcesContent":["// @ts-ignore\nimport _equals from 'deep-eql';\nimport { IOptions } from './types';\nimport { findLastIndex, findIndex } from 'lodash';\n\n/**\n * 深度相等性比較函式\n * Deep equality comparison function\n *\n * 應用情境：\n * - 比較兩個物件是否深度相等\n * - 用於去重邏輯中的相等性判斷\n * - Compare if two objects are deeply equal\n * - Used for equality checking in deduplication logic\n *\n * @param a1 - 要比較的第一個值 / First value to compare\n * @param a2 - 要比較的第二個值 / Second value to compare\n * @returns 是否相等 / Whether equal\n *\n * @example\n * equals({a: 1}, {a: 1}); // => true\n * equals([1, 2], [1, 2]); // => true\n * equals({a: 1}, {a: 2}); // => false\n */\nexport function equals<T>(a1: T, a2: T): boolean\nexport function equals<T>(a1: T, a2: unknown): a2 is T\nexport function equals<T>(a1: unknown, a2: T): a1 is T\nexport function equals(a1: any, a2: any): boolean\n{\n\treturn _equals(a1, a2)\n}\n\n/**\n * 建立預設過濾回調函式\n * Create default filter callback function\n *\n * 應用情境：\n * - 為 array_unique 函式建立預設的過濾邏輯\n * - 支援自訂 checker 和 filter 函式\n * - Create default filter logic for array_unique function\n * - Support custom checker and filter functions\n *\n * @param options - 選項物件包含 checker、filter、removeFromFirst / Options object with checker, filter, removeFromFirst\n * @returns 過濾回調函式 / Filter callback function\n */\nexport function defaultFilter<T>(options: IOptions<T> = {})\n{\n\tconst checker = options.checker || defaultChecker;\n\tconst filter = options.filter || null;\n\n\tconst find = options.removeFromFirst ? findLastIndex : findIndex;\n\n\tconst cb = <K extends any[]>(val: K[keyof K], index: number, arr: K) =>\n\t{\n\t\tlet i = find(arr, a => checker(a, val, arr, arr));\n\t\treturn i === index && (!filter || filter(val));\n\t};\n\n\treturn cb;\n}\n\n// @ts-ignore\n/**\n * 預設相等性檢查函式\n * Default equality check function\n *\n * 使用 deep-eql 進行深度相等性比較。\n * Uses deep-eql for deep equality comparison.\n *\n * @param element - 陣列中的元素 / Element in array\n * @param value - 要比較的新值 / New value to compare\n * @param arr_new - 新陣列 / New array\n * @param arr_old - 舊陣列 / Old array\n * @returns 是否相等 / Whether equal\n */\nexport function defaultChecker<T, R>(element: T, value: R, arr_new?: Array<T | R>, arr_old?: Array<T | R>): boolean\n{\n\treturn _equals(element, value);\n}\n","import { defaultFilter, equals, defaultChecker } from './util';\n\nimport { IOptions } from './types';\n\nexport * from './types';\nexport * from './util';\n\n/**\n * 取得陣列的唯一值，支援深度比較\n * Get unique values from array with deep comparison support\n *\n * 應用情境：\n * - 去除複雜物件陣列中的重複項\n * - 處理巢狀物件和陣列的比對\n * - 支援自訂相等性判斷函式\n * - Remove duplicates from complex object arrays\n * - Handle nested objects and arrays comparison\n * - Support custom equality check function\n *\n * @param arr - 要去重的陣列 / Array to deduplicate\n * @param options - 去重選項 / Deduplication options\n * @returns 去重後的陣列 / Deduplicated array\n * @throws TypeError - 當輸入不是陣列時 / When input is not an array\n *\n * @example\n * // 基本使用\n * array_unique([1, 2, 2, 3]); // => [1, 2, 3]\n *\n * // 物件去重\n * array_unique([{a: 1}, {a: 1}, {a: 2}]); // => [{a: 1}, {a: 2}]\n *\n * // 巢狀陣列去重\n * array_unique([[1,2], [1,2], [1,3]]); // => [[1,2], [1,3]]\n */\nexport function array_unique<T>(arr: T, options: IOptions<T> = {}): T\n{\n\tif (!Array.isArray(arr))\n\t{\n\t\tthrow new TypeError(`Expected an Array but got ${typeof arr}.`)\n\t}\n\n\tconst cb = defaultFilter(options);\n\n\tif (options.overwrite)\n\t{\n\t\tlet index = arr.length;\n\n\t\twhile (index--)\n\t\t{\n\t\t\tlet val = arr[index];\n\n\t\t\tif (!cb(val, index, arr))\n\t\t\t{\n\t\t\t\tarr.splice(index, 1);\n\t\t\t}\n\t\t}\n\n\t\treturn arr;\n\t}\n\n\t// @ts-ignore\n\treturn arr.filter(cb);\n}\n\n/**\n * 覆寫模式去重，直接修改原陣列\n * Overwrite mode deduplication, modifies original array\n *\n * @param arr - 要去重的陣列 / Array to deduplicate\n * @param options - 去重選項 / Deduplication options\n * @returns 去重後的陣列（與輸入相同）/ Deduplicated array (same as input)\n */\nexport function array_unique_overwrite<T>(arr: T, options: IOptions<T> = {}): T\n{\n\treturn array_unique(arr, {\n\t\t...options,\n\t\toverwrite: true,\n\t});\n}\n\n/**\n * 懶惰唯一化函式，支援多種呼叫方式\n * Lazy unique function with multiple calling patterns\n *\n * 應用情境：\n * - 單一陣列輸入\n * - 多個參數或陣列混合輸入\n * - 靈活的 API 設計\n * - Single array input\n * - Multiple arguments or array mixing\n * - Flexible API design\n *\n * @param arr - 陣列或單一元素 / Array or single element\n * @returns 去重後的結果 / Deduplicated result\n *\n * @example\n * // 單一陣列\n * lazy_unique([1, 2, 2, 3]); // => [1, 2, 3]\n *\n * // 多個參數\n * lazy_unique(1, 2, 2, 3); // => [1, 2, 3]\n *\n * // 混合\n * lazy_unique([1, 2], [2, 3]); // => [1, 2, 3]\n */\nexport function lazy_unique<T extends any[]>(arr: T): T\nexport function lazy_unique<T, T1, T2>(a1: T1, a2: T2, ...arr: T[]): Array<T | T1 | T2>\nexport function lazy_unique<T>(...arr: Array<T | T[]>): T | (T | T[])[]\n// @ts-ignore\nexport function lazy_unique<T>(...arr: Array<T | T[]>)\n{\n\tif (arr.length > 1)\n\t{\n\t\treturn array_unique(arr);\n\t}\n\n\treturn array_unique(arr[0]);\n}\n\n/**\n * 懶惰唯一化覆寫模式\n * Lazy unique overwrite mode\n *\n * @param arr - 陣列或參數 / Array or arguments\n * @returns 去重後的結果 / Deduplicated result\n */\nexport function lazy_unique_overwrite<T>(...arr: Array<T | T[]>)\n{\n\tif (arr.length > 1)\n\t{\n\t\treturn array_unique_overwrite(arr);\n\t}\n\n\treturn array_unique_overwrite(arr[0]);\n}\n\n/**\n * 導出工具函式 / Export utility functions\n */\nexport {\n\tequals,\n\tdefaultFilter,\n\tdefaultChecker,\n}\n\nif (process.env.TSDX_FORMAT !== 'esm')\n{\n\tObject.defineProperty(lazy_unique, \"array_unique\", { value: array_unique });\n\tObject.defineProperty(lazy_unique, \"array_unique_overwrite\", { value: array_unique_overwrite });\n\tObject.defineProperty(lazy_unique, \"lazy_unique_overwrite\", { value: lazy_unique_overwrite });\n\n\tObject.defineProperty(lazy_unique, \"equals\", { value: equals });\n\tObject.defineProperty(lazy_unique, \"defaultFilter\", { value: defaultFilter });\n\tObject.defineProperty(lazy_unique, \"defaultChecker\", { value: defaultChecker });\n\n\tObject.defineProperty(lazy_unique, \"lazy_unique\", { value: lazy_unique });\n\tObject.defineProperty(lazy_unique, \"default\", { value: lazy_unique });\n\n\tObject.defineProperty(lazy_unique, \"__esModule\", { value: true });\n}\n\nexport default lazy_unique\n"],"names":["equals","a1","a2","_equals","defaultFilter","options","checker","defaultChecker","filter","find","removeFromFirst","findLastIndex","findIndex","cb","val","index","arr","a","element","value","arr_new","arr_old","array_unique","Array","isArray","TypeError","overwrite","length","splice","array_unique_overwrite","lazy_unique","lazy_unique_overwrite","Object","defineProperty"],"mappings":";;;;EA2BgB,SAAAA,OAAOC,GAASC;IAE/B,OAAOC,EAAQF,GAAIC;AACpB;EAegB,SAAAE,cAAiBC,IAAuB;IAEvD,MAAMC,IAAUD,EAAQC,WAAWC,gBAC7BC,IAASH,EAAQG,UAAU,MAE3BC,IAAOJ,EAAQK,kBAAkBC,EAAAA,gBAAgBC,EAAAA;IAQvD,OANWC,CAAkBC,GAAiBC,GAAeC,MAEpDP,EAAKO,GAAKC,KAAKX,EAAQW,GAAGH,GAAKE,GAAKA,QAC/BD,OAAWP,KAAUA,EAAOM;AAI3C;EAgBM,SAAUP,eAAqBW,GAAYC,GAAUC,GAAwBC;IAElF,OAAOlB,EAAQe,GAASC;AACzB;WC5CgBG,aAAgBN,GAAQX,IAAuB;IAE9D,KAAKkB,MAAMC,QAAQR,IAElB,MAAM,IAAIS,UAAU,oCAAoCT;IAGzD,MAAMH,IAAKT,cAAcC;IAEzB,IAAIA,EAAQqB,WACZ;MACC,IAAIX,IAAQC,EAAIW;MAEhB,MAAOZ,OAIDF,EAFKG,EAAID,IAEDA,GAAOC,MAEnBA,EAAIY,OAAOb,GAAO;MAIpB,OAAOC;AACR;IAGA,OAAOA,EAAIR,OAAOK;AACnB;WAUgBgB,uBAA0Bb,GAAQX,IAAuB;IAExE,OAAOiB,aAAaN,GAAK;SACrBX;MACHqB,YAAW;;AAEb;EA+BgB,SAAAI,eAAkBd;IAEjC,OAEQM,aAFJN,EAAIW,SAAS,IAEIX,IAGDA,EAAI;AACzB;EASgB,SAAAe,yBAA4Bf;IAE3C,OAEQa,uBAFJb,EAAIW,SAAS,IAEcX,IAGDA,EAAI;AACnC;EAaCgB,OAAOC,eAAeH,aAAa,gBAAgB;IAAEX,OAAOG;MAC5DU,OAAOC,eAAeH,aAAa,0BAA0B;IAAEX,OAAOU;MACtEG,OAAOC,eAAeH,aAAa,yBAAyB;IAAEX,OAAOY;MAErEC,OAAOC,eAAeH,aAAa,UAAU;IAAEX,OAAOnB;MACtDgC,OAAOC,eAAeH,aAAa,iBAAiB;IAAEX,OAAOf;MAC7D4B,OAAOC,eAAeH,aAAa,kBAAkB;IAAEX,OAAOZ;MAE9DyB,OAAOC,eAAeH,aAAa,eAAe;IAAEX,OAAOW;MAC3DE,OAAOC,eAAeH,aAAa,WAAW;IAAEX,OAAOW;MAEvDE,OAAOC,eAAeH,aAAa,cAAc;IAAEX,QAAO;;;;;;;"}