UNPKG

18.5 kBSource Map (JSON)View Raw
1{"version":3,"file":"list-differ.esm.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"],"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"],"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"],"mappings":"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"}
\No newline at end of file