planttheidea / micro-memoize Goto Github PK
View Code? Open in Web Editor NEWA tiny, crazy fast memoization library for the 95% use-case
License: MIT License
A tiny, crazy fast memoization library for the 95% use-case
License: MIT License
Hello,
For a long-running web-sevice, I'd like async data to be auto-removed from the memoization-cache every 20 minutes. Is there a micro-memoize formula solution to this problem?
I've been using micro-memoize for a year or two now and its been great. Thank you for any response you may have.
Refer: davidjerleke/embla-carousel#481
TS2349: This expression is not callable. Type 'typeof import("E:/@extractus/node_modules/.pnpm/[email protected]/node_modules/micro-memoize/index")' has no call signatures.
Hi and thanks for the great lib! Greatly boosted my app which is built around immutability but has expensive computations.
How do we get an infinite caching? maxSize: Number.POSITIVE_INFINITY
?
I wanted to test by own memoizing library against other ones to compare my speed and I wanted to try out your benchmarks. All the functions which you are testing are incorrect. You are using fibonacci functions which call themselves and are later memoized, but the non-memoized versions are called. You didn't notice because all your benchmarks are with input 35 which is low enough for the slowdown not to show.
const fib = n => n < 2 ? n : fib(n -1) + fib(n - 2)
const memo = mMemo(fib)
As you can clearly see - fib
is calling fib
, not mMemo
. You don't have memoization at all.
const fib = mMemo(n => n < 2 ? n : fib(n -1) + fib(n - 2))
That is the correct way.
When isPromise
is true
and one of those options return a rejected Promise
, the moized functions should return that rejected Promise
. Otherwise, this would result in an unhandled rejected promise (the error is not propagated).
I am using micro-memoize
to skip doing work in the future calls for some async functions. However, the function runs again in the subsequent calls.
I cannot reproduce it in a simple example like the following,
import memoize from 'micro-memoize';
function sleep(n) {
return new Promise(resolve => setTimeout(resolve, n));
}
async function doSomething_raw() {
console.log("running...")
await sleep(1000)
return "hey"
}
const doSomething = memoize(doSomething_raw, { isPromise: true })
await doSomething()
await doSomething()
But in the complex project, I am seeing the function running two times:
https://github.com/aminya/setup-cpp/blob/771f77f24f8e63f91c375b6bba0f861ca7ea16c8/src/utils/setup/setupPipPack.ts#L86-L93
https://github.com/aminya/setup-cpp/actions/runs/6114633731/job/16596651001?pr=198#step:8:2476
https://github.com/aminya/setup-cpp/actions/runs/6114633731/job/16596651001?pr=198#step:8:3043
One of the differences is that there are nested memorized async functions in the complex function.
Hi everyone,
I made a mistake in my implementation / understanding of the code and closed this issue as irrelevant.
Hi there! It seems that in version 3, memoized functions do not keep their type signatures. Can we fix support for this? I checked the type definitions and this can probably be done with:
export default function memoize<T extends Function>(
fn: T | MicroMemoize.Memoized,
options?: MicroMemoize.Options,
): T
Or:
export default function memoize<T extends Function>(
fn: T | MicroMemoize.Memoized,
options?: MicroMemoize.Options,
): T & MicroMemoize.Memoized;
If the arguments are very big, sometimes WeakMap is the only practical solution
Is there a way to snapshot results so that memoized output is not affected by changes?
const memoize = require('micro-memoize');
const assembleToObject = (one, two) => ({ one, two });
const memoized = memoize(assembleToObject);
console.log(memoized('one', 'two'));
console.log(memoized('one', 'two'));
memoized('one', 'two').one = 'changed';
console.log(memoized('one', 'two'));
This prints:
{ one: 'one', two: 'two' }
{ one: 'one', two: 'two' }
{ one: 'changed', two: 'two' }
I want the code above always return{ one, two }
Getting this error with the recommended import from tsc --build
import memoize from "micro-memoize/mjs";
error TS2307: Cannot find module 'micro-memoize/mjs' or its corresponding type declarations.
1 import memoize from "micro-memoize/mjs";
~~~~~~~~~~~~~~~~~~~
It looks like the types are bundled with Node in the mjs folder. The types are packaged with the root library. Is there something I'm missing or a way for me to fix this import?
Hi,
I just today installed new project without npm lockfile and building failed for moize with TypeScript errors
`node_modules/.pnpm/[email protected]/node_modules/moize/index.d.ts:16:21 - error TS2314: Generic type 'Cache' requires 1 type argument(s).
16 export type Cache = MicroMemoize.Cache;
~~~~~~~~~~~~~~~~~~
node_modules/.pnpm/[email protected]/node_modules/moize/index.d.ts:17:35 - error TS2314: Generic type 'Options' requires 1 type argument(s).
17 export type MicroMemoizeOptions = MicroMemoize.Options;`
I dug deeper as we use moize without problems elsewhere and found out that in that new generated lock file peer dependency micro-memoize is resolved with version 4.0.12 which is 5 days old new version in NPM a there were changes in typings files which cause these errors.
So I went with workaround and edited manually our lock file to use again 4.0.11 and it works.
Could this be fixed so we do not need to manually update lockfiles? Thank You!
This library incorrectly defines npm tags for memcache and memcached and should be removed, as I can not find any evidence of an integration to memcache.
It is misleading for people looking for memcache libraries to get this result which solves an entirely different problem.
Hi there, Looks like a great utility. Would it be possible to add the cache "timeout"? Equivalent of what memoizee has.
I get this error when trying to execute jest unit tests.
TypeError: (0 , micro_memoize_1.default) is not a function
Import syntax used in codebase
import memoize from 'micro-memoize';
Typescript compiler configured to use CommonJs
module for unit tests. I looked what is defined here
And seems export for cjs file is defined correctly.
I have created a simple repo to reproduce an error: https://github.com/r0ss0neri/memoise-import-example
steps are simple:
Thanks for advice.
When using micro-memoize version 4.0.10
in a react application, starting the application in development mode is giving the following warnings:
Failed to parse source map from '/home/user/Projects/cra-app/node_modules/src/Cache.ts' file: Error: ENOENT: no such file or directory, open '/home/user/Projects/cra-app/node_modules/src/Cache.ts'
Failed to parse source map from '/home/user/Projects/cra-app/node_modules/src/index.ts' file: Error: ENOENT: no such file or directory, open '/home/user/Projects/cra-app/node_modules/src/index.ts'
Failed to parse source map from '/home/user/Projects/cra-app/node_modules/src/utils.ts' file: Error: ENOENT: no such file or directory, open '/home/user/Projects/cra-app/node_modules/src/utils.ts'
which then leads to some warning in following lines in the console.
Indeed, after looking at the contents of the .map
files in the package of version 4.0.10
the files are referencing two paths up, which leads to trying to look at a path outside the package:
$ cat node_modules/micro-memoize/dist/micro-memoize.js.map
{"version":3,"file":"micro-memoize.js","sources":["../../src/utils.ts","../../src/Cache.ts","../../src/index.ts"],"sourcesContent":[null,null,null],"names":[],"mapping
[...truncated...]
This is happening with latest version 4.0.10
. Probably, somehow, the source map files were badly generated because the previous patch version 4.0.9
does not generate these warnings. I have reverted as a workaround.
Could you please add git tags on new releases? This will automatically create GitHub releases, which can help users getting notified on new releases via RSS.
Thanks for this project!
I copied and pasted the example code from the README:
const ignoreFunctionArgs = (one: string, two: () => {}) => [one, two];
const memoized = memoize(ignoreFunctionArgs, {
isEqual(key1: string, key2: string) {
return key1.args === key2.args;
},
transformKey(args: any[]) {
return {
args: JSON.stringify(args)
};
}
});
However, I get TypeScript errors:
Type '{ (value: any, replacer?: (this: any, key: string, value: any) => any, space?: string | number): string; (value: any, replacer?: (string | number)[], space?: string | number): string; }' is not assignable to type 'KeyTransformer'.
Type 'string' is not assignable to type 'Key'.
The second example also has type errors:
const ignoreFunctionArgs = (one: string, two: () => {}) => [one, two];
const memoized = memoize(ignoreFunctionArgs, {
isEqual(key1: string, key2: string) {
return key1.args === key2.args;
},
transformKey(args: any[]) {
return {
args: JSON.stringify(args)
};
}
});
Which errors out with:
Type '(args: any[]) => { args: string; }' is not assignable to type 'KeyTransformer'.
Type '{ args: string; }' is missing the following properties from type 'any[]': length, pop, push, concat, and 28 more.
Hi again and thanks for this amazing lib!
I'm having trouble with my unit tests in which the memoized wrongly share results between unrelated tests 😅. (would not happen in real execution, by design)
The easy solution is to reset the cache between each test with beforeEach
However I'm not sure how I should be reseting the cache.
Would this reliably work?
memoized.cache = {
keys: [[]],
values: [],
}
I didn't see any obvious way to handle a case like the following.
const foo = (options, a, b) => { ... }
Here, you'd want options to use deep equality, but a and b to compare identities.
Is there any convenient way to do this with micro-memoize?
Thanks.
Hi there,
I have similar problem as #37
TS 4.1 introduced new compilerOption noUncheckedIndexedAccess. see:
https://www.typescriptlang.org/tsconfig#noUncheckedIndexedAccess
When I use TS 4.1 or above with this option, micro-memoize fails to compile.
To reproduce bug, create a project with TS 4.1 or above, turn on noUncheckedIndexedAccess, import and use micro-memoize and run a TS build. I see:
tsc --noEmit
node_modules/micro-memoize/src/Cache.ts:82:23 - error TS2345: Argument of type 'Key | undefined' is not assignable to parameter of type 'Key'.
Type 'undefined' is not assignable to type 'any[]'.
82 if (isMatchingKey(keys[0], keyToMatch)) {
~~~~~~~
node_modules/micro-memoize/src/Cache.ts:88:27 - error TS2345: Argument of type 'Key | undefined' is not assignable to parameter of type 'Key'.
Type 'undefined' is not assignable to type 'any[]'.
88 if (isMatchingKey(keys[index], keyToMatch)) {
~~~~~~~~~~~
node_modules/micro-memoize/src/Cache.ts:176:13 - error TS2339: Property 'length' does not exist on type 'Key | undefined'.
176 const { length } = existingKey;
~~~~~~
node_modules/micro-memoize/src/Cache.ts:186:22 - error TS2532: Object is possibly 'undefined'.
186 if (!isEqual(existingKey[index], keyToMatch[index])) {
~~~~~~~~~~~
node_modules/micro-memoize/src/Cache.ts:194:20 - error TS2532: Object is possibly 'undefined'.
194 return isEqual(existingKey[0], keyToMatch[0]) ? 0 : -1;
~~~~~~~~~~~
node_modules/micro-memoize/src/Cache.ts:220:7 - error TS2322: Type 'Key | undefined' is not assignable to type 'Key'.
Type 'undefined' is not assignable to type 'any[]'.
220 keys[index + 1] = keys[index];
~~~~~~~~~~~~~~~
node_modules/micro-memoize/src/Cache.ts:269:43 - error TS2345: Argument of type 'Key | undefined' is not assignable to parameter of type 'RawKey'.
Type 'undefined' is not assignable to type 'RawKey'.
269 const keyIndex = this.getKeyIndex(firstKey);
~~~~~~~~
Found 7 errors in the same file, starting at: node_modules/micro-memoize/src/Cache.ts:82
Hello!
"micro-memoize": "^4.0.6"
I have a bunch of type errors related with micro-memoize:
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(33,7):
TS2322: Type '(keyToMatch: any[]) => number' is not assignable to type 'KeyIndexGetter'.
Types of parameters 'keyToMatch' and 'keyToMatch' are incompatible.
Type 'RawKey' is not assignable to type 'any[]'.
Type 'IArguments' is missing the following properties from type 'any[]': pop, push, concat, join, and 24 more.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(34,16):
TS2532: Object is possibly 'undefined'.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(35,7):
TS2322: Type '(keyToMatch: any[]) => number' is not assignable to type 'KeyIndexGetter'.
Types of parameters 'keyToMatch' and 'keyToMatch' are incompatible.
Type 'RawKey' is not assignable to type 'any[]'.
Type 'IArguments' is not assignable to type 'any[]'.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(37,7):
TS2322: Type '(keyToMatch: any[]) => 0 | -1' is not assignable to type 'KeyIndexGetter'.
Types of parameters 'keyToMatch' and 'keyToMatch' are incompatible.
Type 'RawKey' is not assignable to type 'any[]'.
Type 'IArguments' is not assignable to type 'any[]'.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(79,9):
TS2532: Object is possibly 'undefined'.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(79,9):
TS2722: Cannot invoke an object which is possibly 'undefined'.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(83,9):
TS2532: Object is possibly 'undefined'.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(85,13):
TS2722: Cannot invoke an object which is possibly 'undefined'.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(125,16):
TS2722: Cannot invoke an object which is possibly 'undefined'.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(165,12):
TS2722: Cannot invoke an object which is possibly 'undefined'.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(204,33):
TS2532: Object is possibly 'undefined'.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(206,7):
TS2322: Type 'number | undefined' is not assignable to type 'number'.
Type 'undefined' is not assignable to type 'number'.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(206,21):
TS2322: Type 'number | undefined' is not assignable to type 'number'.
Type 'undefined' is not assignable to type 'number'.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(228,11):
TS2722: Cannot invoke an object which is possibly 'undefined'.
ERROR in D:/Tripment/code/http-services-with-general-components/node_modules/micro-memoize/src/Cache.ts(232,11):
TS2722: Cannot invoke an object which is possibly 'undefined'.
Version: typescript 3.4.5, tslint 5.16.0
tsconfig
{
"compilerOptions": {
"target": "esnext",
"module": "esnext",
"lib": ["dom", "es2017"],
"moduleResolution": "node",
"esModuleInterop": true,
"strict": true,
/* Additional Checks */
"noImplicitReturns": true /* Report error when not all code paths in function return a value. */,
"noFallthroughCasesInSwitch": true /* Report errors for fallthrough cases in switch statement. */,
/* Debugging Options */
"traceResolution": false /* Report module resolution log messages. */,
"listEmittedFiles": false /* Print names of generated files part of the compilation. */,
"listFiles": false /* Print names of files part of the compilation. */,
"pretty": true /* Stylize errors and messages using color and context. */,
/* Experimental Options */
// "experimentalDecorators": true /* Enables experimental support for ES7 decorators. */,
// "emitDecoratorMetadata": true /* Enables experimental support for emitting type metadata for decorators. */,
"jsx": "preserve"
},
"compileOnSave": false,
"exclude": ["node_modules/**/*"]
}
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.