From d0c61c546619a6f5971f2e61af92c124b6174b51 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Wed, 26 Jan 2022 16:12:35 +0100 Subject: [PATCH 1/3] refactor(memoize): get rid of memoizee prod dependency Refs #7694 --- package-lock.json | 247 +-------------------------------- package.json | 1 - src/core/plugins/samples/fn.js | 8 +- src/core/utils.js | 42 ++++++ 4 files changed, 51 insertions(+), 247 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3b68ca301c1..31d4a0b74bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,6 @@ "js-file-download": "^0.4.12", "js-yaml": "=4.1.0", "lodash": "^4.17.21", - "memoizee": "^0.4.15", "prop-types": "^15.7.2", "randombytes": "^2.1.0", "react": "=17.0.2", @@ -8416,15 +8415,6 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, - "node_modules/d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "dependencies": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "node_modules/dargs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", @@ -9522,51 +9512,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "dependencies": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - } - }, - "node_modules/es5-ext/node_modules/next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - }, - "node_modules/es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "node_modules/es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "dependencies": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "node_modules/es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "dependencies": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -10370,15 +10315,6 @@ "node": ">= 0.6" } }, - "node_modules/event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "dependencies": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "node_modules/event-stream": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", @@ -10701,19 +10637,6 @@ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true }, - "node_modules/ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "dependencies": { - "type": "^2.0.0" - } - }, - "node_modules/ext/node_modules/type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" - }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -13841,7 +13764,8 @@ "node_modules/is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true }, "node_modules/is-regex": { "version": "1.1.4", @@ -18033,14 +17957,6 @@ "node": ">=10" } }, - "node_modules/lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "dependencies": { - "es5-ext": "~0.10.2" - } - }, "node_modules/lws": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lws/-/lws-3.1.0.tgz", @@ -18408,21 +18324,6 @@ "node": ">= 0.6" } }, - "node_modules/memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", - "dependencies": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - } - }, "node_modules/memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -19725,11 +19626,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -26746,15 +26642,6 @@ "node": ">=0.6.0" } }, - "node_modules/timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "dependencies": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, "node_modules/timsort": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", @@ -27070,11 +26957,6 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "node_modules/type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -35753,15 +35635,6 @@ } } }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, "dargs": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/dargs/-/dargs-7.0.0.tgz", @@ -36651,53 +36524,6 @@ "is-symbol": "^1.0.2" } }, - "es5-ext": { - "version": "0.10.53", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", - "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", - "requires": { - "es6-iterator": "~2.0.3", - "es6-symbol": "~3.1.3", - "next-tick": "~1.0.0" - }, - "dependencies": { - "next-tick": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", - "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" - } - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "es6-weak-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-weak-map/-/es6-weak-map-2.0.3.tgz", - "integrity": "sha512-p5um32HOTO1kP+w7PRnB+5lQ43Z6muuMuIMffvDN8ZB4GcnjLBV6zGStpbASIMk4DCAvEaamhe2zhyCb/QXXsA==", - "requires": { - "d": "1", - "es5-ext": "^0.10.46", - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.1" - } - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -37291,15 +37117,6 @@ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", "dev": true }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, "event-stream": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-4.0.1.tgz", @@ -37580,21 +37397,6 @@ } } }, - "ext": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", - "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", - "requires": { - "type": "^2.0.0" - }, - "dependencies": { - "type": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", - "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" - } - } - }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -39970,7 +39772,8 @@ "is-promise": { "version": "2.2.2", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", - "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==", + "dev": true }, "is-regex": { "version": "1.1.4", @@ -43205,14 +43008,6 @@ "yallist": "^4.0.0" } }, - "lru-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/lru-queue/-/lru-queue-0.1.0.tgz", - "integrity": "sha1-Jzi9nw089PhEkMVzbEhpmsYyzaM=", - "requires": { - "es5-ext": "~0.10.2" - } - }, "lws": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/lws/-/lws-3.1.0.tgz", @@ -43498,21 +43293,6 @@ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", "dev": true }, - "memoizee": { - "version": "0.4.15", - "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.4.15.tgz", - "integrity": "sha512-UBWmJpLZd5STPm7PMUlOw/TSy972M+z8gcyQ5veOnSDRREz/0bmpyTfKt3/51DhEBqCZQn1udM/5flcSPYhkdQ==", - "requires": { - "d": "^1.0.1", - "es5-ext": "^0.10.53", - "es6-weak-map": "^2.0.3", - "event-emitter": "^0.3.5", - "is-promise": "^2.2.2", - "lru-queue": "^0.1.0", - "next-tick": "^1.1.0", - "timers-ext": "^0.1.7" - } - }, "memory-fs": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", @@ -44551,11 +44331,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -50001,15 +49776,6 @@ "setimmediate": "^1.0.4" } }, - "timers-ext": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/timers-ext/-/timers-ext-0.1.7.tgz", - "integrity": "sha512-b85NUNzTSdodShTIbky6ZF02e8STtVVfD+fu4aXXShEELpozH+bCpJLYMPZbsABN2wDH7fJpqIoXxJpzbf0NqQ==", - "requires": { - "es5-ext": "~0.10.46", - "next-tick": "1" - } - }, "timsort": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz", @@ -50260,11 +50026,6 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", diff --git a/package.json b/package.json index 93bc42accbd..2a2ea92544e 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,6 @@ "js-file-download": "^0.4.12", "js-yaml": "=4.1.0", "lodash": "^4.17.21", - "memoizee": "^0.4.15", "prop-types": "^15.7.2", "randombytes": "^2.1.0", "react": "=17.0.2", diff --git a/src/core/plugins/samples/fn.js b/src/core/plugins/samples/fn.js index 8e9921cd27c..14e395c8aaa 100644 --- a/src/core/plugins/samples/fn.js +++ b/src/core/plugins/samples/fn.js @@ -1,6 +1,6 @@ import { objectify, isFunc, normalizeArray, deeplyStripKey } from "core/utils" import XML from "xml" -import memoizee from "memoizee" +import { memoizeN } from "core/utils" import isEmpty from "lodash/isEmpty" const primitives = { @@ -602,6 +602,8 @@ export const createXMLExample = (schema, config, o) => { export const sampleFromSchema = (schema, config, o) => sampleFromSchemaGeneric(schema, config, o, false) -export const memoizedCreateXMLExample = memoizee(createXMLExample) +const resolver = (arg1, arg2, arg3) => [arg1, JSON.stringify(arg2), JSON.stringify(arg3)] -export const memoizedSampleFromSchema = memoizee(sampleFromSchema) +export const memoizedCreateXMLExample = memoizeN(createXMLExample, resolver) + +export const memoizedSampleFromSchema = memoizeN(sampleFromSchema, resolver) diff --git a/src/core/utils.js b/src/core/utils.js index 7a51108129e..a2493c0950b 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -153,6 +153,48 @@ export function isArray(thing) { // I've changed memoize libs more than once, so I'm using this a way to make that simpler export const memoize = _memoize +/** + * This function is extension on top of lodash.memoize. + * It uses all the arguments of the `fn` as the cache key instead of just the first one. + * If resolver is provided, it determines the cache key for + * storing the result based on the arguments provided to the memoized function. + */ +export const memoizeN = (fn, resolver = ((...args) => args)) => { + const shallowArrayEquals = (a) => (b) => { + return Array.isArray(a) && Array.isArray(b) + && a.length === b.length + && a.every((val, index) => val === b[index]) + } + + class Cache extends Map { + delete(key) { + const keys = Array.from(this.keys()) + const foundKey = keys.find(shallowArrayEquals(key)) + return super.delete(foundKey) + } + + get(key) { + const keys = Array.from(this.keys()) + const foundKey = keys.find(shallowArrayEquals(key)) + return super.get(foundKey) + } + + has(key) { + const keys = Array.from(this.keys()) + return keys.findIndex(shallowArrayEquals(key)) !== -1 + } + } + + const { Cache: OriginalCache } = _memoize + _memoize.Cache = Cache + + const memoized = _memoize(fn, resolver) + + _memoize.Cache = OriginalCache + + return memoized +} + export function objMap(obj, fn) { return Object.keys(obj).reduce((newObj, key) => { newObj[key] = fn(obj[key], key) From f9f270b4d2f3fa38dab96299b78ad96790ff05e7 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Wed, 26 Jan 2022 16:17:38 +0100 Subject: [PATCH 2/3] fix: test --- src/core/plugins/samples/fn.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/plugins/samples/fn.js b/src/core/plugins/samples/fn.js index 14e395c8aaa..f697aebc32b 100644 --- a/src/core/plugins/samples/fn.js +++ b/src/core/plugins/samples/fn.js @@ -1,7 +1,6 @@ -import { objectify, isFunc, normalizeArray, deeplyStripKey } from "core/utils" import XML from "xml" -import { memoizeN } from "core/utils" import isEmpty from "lodash/isEmpty" +import { objectify, isFunc, normalizeArray, deeplyStripKey, memoizeN } from "core/utils" const primitives = { "string": () => "string", From 18116498669f7030ff4e8e5a6ecf013558005058 Mon Sep 17 00:00:00 2001 From: Vladimir Gorej Date: Wed, 26 Jan 2022 16:34:15 +0100 Subject: [PATCH 3/3] fix: test --- src/core/plugins/samples/fn.js | 4 ++- src/core/utils.js | 42 ------------------------------- src/helpers/memoizeN.js | 46 ++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+), 43 deletions(-) create mode 100644 src/helpers/memoizeN.js diff --git a/src/core/plugins/samples/fn.js b/src/core/plugins/samples/fn.js index f697aebc32b..41b1cd199bd 100644 --- a/src/core/plugins/samples/fn.js +++ b/src/core/plugins/samples/fn.js @@ -1,6 +1,8 @@ import XML from "xml" import isEmpty from "lodash/isEmpty" -import { objectify, isFunc, normalizeArray, deeplyStripKey, memoizeN } from "core/utils" +import { objectify, isFunc, normalizeArray, deeplyStripKey } from "core/utils" + +import memoizeN from "../../../helpers/memoizeN" const primitives = { "string": () => "string", diff --git a/src/core/utils.js b/src/core/utils.js index a2493c0950b..7a51108129e 100644 --- a/src/core/utils.js +++ b/src/core/utils.js @@ -153,48 +153,6 @@ export function isArray(thing) { // I've changed memoize libs more than once, so I'm using this a way to make that simpler export const memoize = _memoize -/** - * This function is extension on top of lodash.memoize. - * It uses all the arguments of the `fn` as the cache key instead of just the first one. - * If resolver is provided, it determines the cache key for - * storing the result based on the arguments provided to the memoized function. - */ -export const memoizeN = (fn, resolver = ((...args) => args)) => { - const shallowArrayEquals = (a) => (b) => { - return Array.isArray(a) && Array.isArray(b) - && a.length === b.length - && a.every((val, index) => val === b[index]) - } - - class Cache extends Map { - delete(key) { - const keys = Array.from(this.keys()) - const foundKey = keys.find(shallowArrayEquals(key)) - return super.delete(foundKey) - } - - get(key) { - const keys = Array.from(this.keys()) - const foundKey = keys.find(shallowArrayEquals(key)) - return super.get(foundKey) - } - - has(key) { - const keys = Array.from(this.keys()) - return keys.findIndex(shallowArrayEquals(key)) !== -1 - } - } - - const { Cache: OriginalCache } = _memoize - _memoize.Cache = Cache - - const memoized = _memoize(fn, resolver) - - _memoize.Cache = OriginalCache - - return memoized -} - export function objMap(obj, fn) { return Object.keys(obj).reduce((newObj, key) => { newObj[key] = fn(obj[key], key) diff --git a/src/helpers/memoizeN.js b/src/helpers/memoizeN.js new file mode 100644 index 00000000000..84c5375264c --- /dev/null +++ b/src/helpers/memoizeN.js @@ -0,0 +1,46 @@ +import memoize from "lodash/memoize" + +/** + * This function is extension on top of lodash.memoize. + * It uses all the arguments of the `fn` as the cache key instead of just the first one. + * If resolver is provided, it determines the cache key for + * storing the result based on the arguments provided to the memoized function. + */ + +const memoizeN = (fn, resolver = ((...args) => args)) => { + const shallowArrayEquals = (a) => (b) => { + return Array.isArray(a) && Array.isArray(b) + && a.length === b.length + && a.every((val, index) => val === b[index]) + } + + class Cache extends Map { + delete(key) { + const keys = Array.from(this.keys()) + const foundKey = keys.find(shallowArrayEquals(key)) + return super.delete(foundKey) + } + + get(key) { + const keys = Array.from(this.keys()) + const foundKey = keys.find(shallowArrayEquals(key)) + return super.get(foundKey) + } + + has(key) { + const keys = Array.from(this.keys()) + return keys.findIndex(shallowArrayEquals(key)) !== -1 + } + } + + const { Cache: OriginalCache } = memoize + memoize.Cache = Cache + + const memoized = memoize(fn, resolver) + + memoize.Cache = OriginalCache + + return memoized +} + +export default memoizeN