UNPKG

15.9 kBSource Map (JSON)View Raw
1{"version":3,"file":"list-differ.min.js","sources":["../src/PolyMap.ts","../src/HashMap.ts","../src/consts.ts","../src/Link.ts","../src/Result.ts","../src/utils.ts","../src/ListDiffer.ts","../src/index.umd.ts"],"sourcesContent":["/*\negjs-list-differ\nCopyright (c) 2019-present NAVER Corp.\nMIT license\n*/\nexport default class PolyMap<T> {\n private keys: T[] = [];\n private values: number[] = [];\n public get(key: T): number {\n return this.values[this.keys.indexOf(key)];\n }\n public set(key: T, value: number) {\n const keys = this.keys;\n const values = this.values;\n const prevIndex = keys.indexOf(key);\n const index = prevIndex === -1 ? keys.length : prevIndex;\n\n keys[index] = key;\n values[index] = value;\n }\n}\n","/*\negjs-list-differ\nCopyright (c) 2019-present NAVER Corp.\nMIT license\n*/\nexport default class HashMap<T> {\n private object = {};\n public get(key: number | string): T {\n return this.object[key];\n }\n public set(key: number | string, value: T) {\n this.object[key] = value;\n }\n};\n\n","/*\negjs-list-differ\nCopyright (c) 2019-present NAVER Corp.\nMIT license\n*/\nexport const SUPPORT_MAP = typeof Map === \"function\";\n","/*\negjs-list-differ\nCopyright (c) 2019-present NAVER Corp.\nMIT license\n*/\nexport default class Link {\n prev?: Link;\n next?: Link;\n\n public connect(prevLink?: Link, nextLink?: Link) {\n this.prev = prevLink;\n this.next = nextLink;\n\n prevLink && (prevLink.next = this);\n nextLink && (nextLink.prev = this);\n }\n public disconnect() {\n // In double linked list, diconnect the interconnected relationship.\n const prevLink = this.prev;\n const nextLink = this.next;\n prevLink && (prevLink.next = nextLink);\n nextLink && (nextLink.prev = prevLink);\n }\n public getIndex() {\n let link: Link | undefined = this;\n let index = -1;\n\n while (link) {\n link = link.prev;\n ++index;\n }\n return index;\n }\n}\n","/*\negjs-list-differ\nCopyright (c) 2019-present NAVER Corp.\nMIT license\n*/\nimport Link from \"./Link\";\n\nfunction orderChanged(changed: number[][], fixed: boolean[]) {\n // It is roughly in the order of these examples.\n // 4, 6, 0, 2, 1, 3, 5, 7\n const fromLinks: Link[] = [];\n // 0, 1, 2, 3, 4, 5, 6, 7\n const toLinks: Link[] = [];\n\n changed.forEach(([from, to]) => {\n const link = new Link();\n\n fromLinks[from] = link;\n toLinks[to] = link;\n });\n // `fromLinks` are connected to each other by double linked list.\n fromLinks.forEach((link, i) => {\n link.connect(fromLinks[i - 1]);\n });\n\n return changed.filter((_, i) => !fixed[i]).map(([from, to], i) => {\n if (from === to) {\n return [0, 0];\n }\n const fromLink = fromLinks[from];\n const toLink = toLinks[to - 1];\n const fromIndex = fromLink.getIndex();\n\n // Disconnect the link connected to `fromLink`.\n fromLink.disconnect();\n\n // Connect `fromLink` to the right of `toLink`.\n if (!toLink) {\n fromLink.connect(undefined, fromLinks[0]);\n } else {\n fromLink.connect(toLink, toLink.next);\n }\n const toIndex = fromLink.getIndex();\n return [fromIndex, toIndex];\n });\n}\n\nexport default class Result<T = any> {\n public prevList: T[];\n public list: T[];\n public added: number[];\n public removed: number[];\n public changed: number[][];\n public maintained: number[][];\n private changedBeforeAdded: number[][];\n private fixed: boolean[];\n\n private cacheOrdered: number[][];\n private cachePureChanged: number[][];\n constructor(\n prevList: T[],\n list: T[],\n added: number[],\n removed: number[],\n changed: number[][],\n maintained: number[][],\n changedBeforeAdded: number[][],\n fixed: boolean[],\n ) {\n this.prevList = prevList;\n this.list = list;\n this.added = added;\n this.removed = removed;\n this.changed = changed;\n this.maintained = maintained;\n this.changedBeforeAdded = changedBeforeAdded;\n this.fixed = fixed;\n }\n get ordered(): number[][] {\n if (!this.cacheOrdered) {\n this.caculateOrdered();\n }\n return this.cacheOrdered;\n }\n get pureChanged(): number[][] {\n if (!this.cachePureChanged) {\n this.caculateOrdered();\n }\n return this.cachePureChanged;\n }\n private caculateOrdered() {\n const ordered = orderChanged(this.changedBeforeAdded, this.fixed);\n const changed: number[][] = this.changed;\n const pureChanged: number[][] = [];\n\n this.cacheOrdered = ordered.filter(([from, to], i) => {\n const [fromBefore, toBefore] = changed[i];\n\n if (from !== to) {\n pureChanged.push([fromBefore, toBefore]);\n return true;\n }\n });\n this.cachePureChanged = pureChanged;\n }\n}\n","/*\negjs-list-differ\nCopyright (c) 2019-present NAVER Corp.\nMIT license\n*/\nimport { MapInteface, DiffResult } from \"./types\";\nimport PolyMap from \"./PolyMap\";\nimport HashMap from \"./HashMap\";\nimport { SUPPORT_MAP } from \"./consts\";\nimport Result from \"./Result\";\n\n/**\n *\n * @memberof eg.ListDiffer\n * @static\n * @function\n * @param - Previous List <ko> 이전 목록 </ko>\n * @param - List to Update <ko> 업데이트 할 목록 </ko>\n * @param - This callback function returns the key of the item. <ko> 아이템의 키를 반환하는 콜백 함수입니다.</ko>\n * @return - Returns the diff between `prevList` and `list` <ko> `prevList`와 `list`의 다른 점을 반환한다.</ko>\n * @example\n * import { diff } from \"@egjs/list-differ\";\n * // script => eg.ListDiffer.diff\n * const result = diff([0, 1, 2, 3, 4, 5], [7, 8, 0, 4, 3, 6, 2, 1], e => e);\n * // List before update\n * // [1, 2, 3, 4, 5]\n * console.log(result.prevList);\n * // Updated list\n * // [4, 3, 6, 2, 1]\n * console.log(result.list);\n * // Index array of values added to `list`\n * // [0, 1, 5]\n * console.log(result.added);\n * // Index array of values removed in `prevList`\n * // [5]\n * console.log(result.removed);\n * // An array of index pairs of `prevList` and `list` with different indexes from `prevList` and `list`\n * // [[0, 2], [4, 3], [3, 4], [2, 6], [1, 7]]\n * console.log(result.changed);\n * // The subset of `changed` and an array of index pairs that moved data directly. Indicate an array of absolute index pairs of `ordered`.(Formatted by: Array<[index of prevList, index of list]>)\n * // [[4, 3], [3, 4], [2, 6]]\n * console.log(result.pureChanged);\n * // An array of index pairs to be `ordered` that can synchronize `list` before adding data. (Formatted by: Array<[prevIndex, nextIndex]>)\n * // [[4, 1], [4, 2], [4, 3]]\n * console.log(result.ordered);\n * // An array of index pairs of `prevList` and `list` that have not been added/removed so data is preserved\n * // [[0, 2], [4, 3], [3, 4], [2, 6], [1, 7]]\n * console.log(result.maintained);\n */\nexport function diff<T>(\n prevList: T[],\n list: T[],\n findKeyCallback?: (e: T, i: number, arr: T[]) => any\n): DiffResult<T> {\n const mapClass: new () => MapInteface<any, number> = SUPPORT_MAP ? Map : (findKeyCallback ? HashMap : PolyMap);\n const callback = findKeyCallback || ((e: T) => e);\n const added: number[] = [];\n const removed: number[] = [];\n const maintained: number[][] = [];\n const prevKeys = prevList.map(callback);\n const keys = list.map(callback);\n const prevKeyMap: MapInteface<any, number> = new mapClass();\n const keyMap: MapInteface<any, number> = new mapClass();\n const changedBeforeAdded: number[][] = [];\n const fixed: boolean[] = [];\n const removedMap: object = {};\n let changed: number[][] = [];\n let addedCount = 0;\n let removedCount = 0;\n\n // Add prevKeys and keys to the hashmap.\n prevKeys.forEach((key, prevListIndex) => {\n prevKeyMap.set(key, prevListIndex);\n });\n keys.forEach((key, listIndex) => {\n keyMap.set(key, listIndex);\n });\n\n // Compare `prevKeys` and `keys` and add them to `removed` if they are not in `keys`.\n prevKeys.forEach((key, prevListIndex) => {\n const listIndex = keyMap.get(key);\n\n // In prevList, but not in list, it is removed.\n if (typeof listIndex === \"undefined\") {\n ++removedCount;\n removed.push(prevListIndex);\n } else {\n removedMap[listIndex] = removedCount;\n }\n });\n\n // Compare `prevKeys` and `keys` and add them to `added` if they are not in `prevKeys`.\n keys.forEach((key, listIndex) => {\n const prevListIndex = prevKeyMap.get(key);\n\n // In list, but not in prevList, it is added.\n if (typeof prevListIndex === \"undefined\") {\n added.push(listIndex);\n ++addedCount;\n } else {\n maintained.push([prevListIndex, listIndex]);\n removedCount = removedMap[listIndex] || 0;\n\n changedBeforeAdded.push([\n prevListIndex - removedCount,\n listIndex - addedCount,\n ]);\n fixed.push(listIndex === prevListIndex);\n if (prevListIndex !== listIndex) {\n changed.push([prevListIndex, listIndex]);\n }\n }\n });\n // Sort by ascending order of 'to(list's index).\n removed.reverse();\n\n return new Result(\n prevList,\n list,\n added,\n removed,\n changed,\n maintained,\n changedBeforeAdded,\n fixed,\n );\n}\n","/*\negjs-list-differ\nCopyright (c) 2019-present NAVER Corp.\nMIT license\n*/\nimport { DiffResult, ListFormat } from \"./types\";\nimport { diff } from \"./utils\";\n\n/**\n * A module that checks diff when values are added, removed, or changed in an array.\n * @ko 배열 또는 오브젝트에서 값이 추가되거나 삭제되거나 순서가 변경사항을 체크하는 모듈입니다.\n * @memberof eg\n */\nclass ListDiffer<T> {\n private list: T[];\n /**\n * @param - Initializing Data Array. <ko> 초기 설정할 데이터 배열.</ko>\n * @param - This callback function returns the key of the item. <ko> 아이템의 키를 반환하는 콜백 함수입니다.</ko>\n * @example\n * import ListDiffer from \"@egjs/list-differ\";\n * // script => eg.ListDiffer\n * const differ = new ListDiffer([0, 1, 2, 3, 4, 5], e => e);\n * const result = differ.update([7, 8, 0, 4, 3, 6, 2, 1]);\n * // List before update\n * // [1, 2, 3, 4, 5]\n * console.log(result.prevList);\n * // Updated list\n * // [4, 3, 6, 2, 1]\n * console.log(result.list);\n * // Index array of values added to `list`.\n * // [0, 1, 5]\n * console.log(result.added);\n * // Index array of values removed in `prevList`.\n * // [5]\n * console.log(result.removed);\n * // An array of index pairs of `prevList` and `list` with different indexes from `prevList` and `list`.\n * // [[0, 2], [4, 3], [3, 4], [2, 6], [1, 7]]\n * console.log(result.changed);\n * // The subset of `changed` and an array of index pairs that moved data directly. Indicate an array of absolute index pairs of `ordered`.(Formatted by: Array<[index of prevList, index of list]>)\n * // [[4, 3], [3, 4], [2, 6]]\n * console.log(result.pureChanged);\n * // An array of index pairs to be `ordered` that can synchronize `list` before adding data. (Formatted by: Array<[prevIndex, nextIndex]>)\n * // [[4, 1], [4, 2], [4, 3]]\n * console.log(result.ordered);\n * // An array of index pairs of `prevList` and `list` that have not been added/removed so data is preserved.\n * // [[0, 2], [4, 3], [3, 4], [2, 6], [1, 7]]\n * console.log(result.maintained);\n */\n constructor(\n list: ListFormat<T> = [],\n private findKeyCallback?: (e: T, i: number, arr: T[]) => number | string,\n ) {\n this.list = [].slice.call(list);\n }\n /**\n * Update list.\n * @ko 리스트를 업데이트를 합니다.\n * @param - List to update <ko> 업데이트할 리스트 </ko>\n * @return - Returns the results of an update from `prevList` to `list`.<ko> `prevList`에서 `list`로 업데이트한 결과를 반환한다. </ko>\n */\n public update(list: ListFormat<T>): DiffResult<T> {\n const newData: T[] = [].slice.call(list);\n const result = diff<T>(this.list, newData, this.findKeyCallback);\n\n this.list = newData;\n return result;\n }\n}\n\nexport default ListDiffer;\n","/*\negjs-list-differ\nCopyright (c) 2019-present NAVER Corp.\nMIT license\n*/\nimport ListDiffer, { diff } from \"./index\";\n\n(ListDiffer as any).diff = diff;\nexport default ListDiffer;\n"],"names":["key","this","values","keys","indexOf","value","prevIndex","index","length","object","SUPPORT_MAP","Map","prevLink","nextLink","prev","next","link","prevList","list","added","removed","changed","maintained","changedBeforeAdded","fixed","Object","cacheOrdered","caculateOrdered","cachePureChanged","ordered","fromLinks","toLinks","forEach","_a","from","to","Link","i","connect","filter","_","map","fromLink","toLink","fromIndex","getIndex","disconnect","undefined","orderChanged","pureChanged","_b","fromBefore","toBefore","push","diff","findKeyCallback","mapClass","HashMap","PolyMap","callback","e","prevKeys","prevKeyMap","keyMap","removedMap","addedCount","removedCount","prevListIndex","set","listIndex","get","reverse","Result","slice","call","newData","result","ListDiffer"],"mappings":"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"}
\No newline at end of file