UNPKG

19.7 kBSource Map (JSON)View Raw
1{"version":3,"file":"list-differ.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.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 from \"./ListDiffer\";\nexport default ListDiffer;\nexport { diff } from \"./utils\";\nexport * from \"./types\";\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","values","keys","indexOf","value","prevIndex","index","length","object","SUPPORT_MAP","Map","prevLink","nextLink","prev","next","link","orderChanged","changed","fixed","fromLinks","toLinks","forEach","_a","from","to","Link","i","connect","filter","_","map","fromLink","toLink","fromIndex","getIndex","disconnect","undefined","toIndex","prevList","list","added","removed","maintained","changedBeforeAdded","Object","cacheOrdered","caculateOrdered","cachePureChanged","ordered","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