@pacote/memoize
Advanced tools
Comparing version
@@ -6,2 +6,8 @@ # Change Log | ||
# [2.1.0](https://github.com/PacoteJS/pacote/compare/@pacote/memoize@2.0.2...@pacote/memoize@2.1.0) (2023-06-19) | ||
### Features | ||
- 🎸 clear() method and support for LRU caching ([be9cc4d](https://github.com/PacoteJS/pacote/commit/be9cc4d29f26eb4c0c8ef752183da21209947f01)) | ||
## [2.0.2](https://github.com/PacoteJS/pacote/compare/@pacote/memoize@2.0.1...@pacote/memoize@2.0.2) (2023-06-15) | ||
@@ -8,0 +14,0 @@ |
@@ -0,3 +1,9 @@ | ||
export type Options = { | ||
capacity?: number; | ||
}; | ||
type Fn<A extends any[], R> = (...args: A) => R; | ||
export declare function memoize<A extends any[], R>(cacheKeyFn: Fn<A, string>, fn: Fn<A, R>): Fn<A, R>; | ||
type MemoizedFn<A extends any[], R> = Fn<A, R> & { | ||
clear(): void; | ||
}; | ||
export declare function memoize<A extends any[], K, V>(cacheKeyFn: Fn<A, K>, fn: Fn<A, V>, options?: Options): MemoizedFn<A, V>; | ||
export {}; |
"use strict"; | ||
Object.defineProperty(exports, "__esModule", { value: true }); | ||
exports.memoize = void 0; | ||
function createCache() { | ||
var cache = new Map(); | ||
return { | ||
has: function (key) { return cache.has(key); }, | ||
get: function (key) { return cache.get(key); }, | ||
set: function (key, value) { return cache.set(key, value); }, | ||
}; | ||
} | ||
function memoize(cacheKeyFn, fn) { | ||
var cache = createCache(); | ||
return function () { | ||
var lru_cache_1 = require("@pacote/lru-cache"); | ||
function memoize(cacheKeyFn, fn, options) { | ||
if (options === void 0) { options = {}; } | ||
var cache = options.capacity | ||
? new lru_cache_1.LRUCache(options.capacity) | ||
: new Map(); | ||
var memoizedFn = function () { | ||
var args = []; | ||
@@ -26,4 +22,9 @@ for (var _i = 0; _i < arguments.length; _i++) { | ||
}; | ||
return Object.assign(memoizedFn, { | ||
clear: function () { | ||
return cache.clear(); | ||
}, | ||
}); | ||
} | ||
exports.memoize = memoize; | ||
//# sourceMappingURL=index.js.map |
@@ -0,3 +1,9 @@ | ||
export type Options = { | ||
capacity?: number; | ||
}; | ||
type Fn<A extends any[], R> = (...args: A) => R; | ||
export declare function memoize<A extends any[], R>(cacheKeyFn: Fn<A, string>, fn: Fn<A, R>): Fn<A, R>; | ||
type MemoizedFn<A extends any[], R> = Fn<A, R> & { | ||
clear(): void; | ||
}; | ||
export declare function memoize<A extends any[], K, V>(cacheKeyFn: Fn<A, K>, fn: Fn<A, V>, options?: Options): MemoizedFn<A, V>; | ||
export {}; |
@@ -1,12 +0,7 @@ | ||
function createCache() { | ||
const cache = new Map(); | ||
return { | ||
has: (key) => cache.has(key), | ||
get: (key) => cache.get(key), | ||
set: (key, value) => cache.set(key, value), | ||
}; | ||
} | ||
export function memoize(cacheKeyFn, fn) { | ||
const cache = createCache(); | ||
return (...args) => { | ||
import { LRUCache } from '@pacote/lru-cache'; | ||
export function memoize(cacheKeyFn, fn, options = {}) { | ||
const cache = options.capacity | ||
? new LRUCache(options.capacity) | ||
: new Map(); | ||
const memoizedFn = (...args) => { | ||
const key = cacheKeyFn(...args); | ||
@@ -19,3 +14,8 @@ if (!cache.has(key)) { | ||
}; | ||
return Object.assign(memoizedFn, { | ||
clear: () => { | ||
return cache.clear(); | ||
}, | ||
}); | ||
} | ||
//# sourceMappingURL=index.js.map |
{ | ||
"name": "@pacote/memoize", | ||
"description": "Memoization function.", | ||
"version": "2.0.2", | ||
"version": "2.1.0", | ||
"sideEffects": false, | ||
@@ -37,3 +37,6 @@ "license": "MIT", | ||
}, | ||
"gitHead": "fbaede424db38eb61497d56835a012e23ab774f2" | ||
"gitHead": "64a608b1b6d702f9f665381a2a70adaea131846d", | ||
"dependencies": { | ||
"@pacote/lru-cache": "^0.1.0" | ||
} | ||
} |
@@ -0,20 +1,23 @@ | ||
import { LRUCache } from '@pacote/lru-cache' | ||
export type Options = { | ||
capacity?: number | ||
} | ||
type Fn<A extends any[], R> = (...args: A) => R | ||
function createCache<R>() { | ||
const cache = new Map<string, R>() | ||
return { | ||
has: (key: string) => cache.has(key), | ||
get: (key: string) => cache.get(key), | ||
set: (key: string, value: R) => cache.set(key, value), | ||
} | ||
type MemoizedFn<A extends any[], R> = Fn<A, R> & { | ||
clear(): void | ||
} | ||
export function memoize<A extends any[], R>( | ||
cacheKeyFn: Fn<A, string>, | ||
fn: Fn<A, R> | ||
): Fn<A, R> { | ||
const cache = createCache<R>() | ||
export function memoize<A extends any[], K, V>( | ||
cacheKeyFn: Fn<A, K>, | ||
fn: Fn<A, V>, | ||
options: Options = {} | ||
): MemoizedFn<A, V> { | ||
const cache = options.capacity | ||
? new LRUCache<K, V>(options.capacity) | ||
: new Map<K, V>() | ||
return (...args) => { | ||
const memoizedFn: Fn<A, V> = (...args: A) => { | ||
const key = cacheKeyFn(...args) | ||
@@ -29,2 +32,8 @@ | ||
} | ||
return Object.assign(memoizedFn, { | ||
clear: () => { | ||
return cache.clear() | ||
}, | ||
}) | ||
} |
@@ -18,1 +18,24 @@ import { assert, property, func, string, anything } from 'fast-check' | ||
}) | ||
test('clear memoize cache', () => { | ||
const mockFn = jest.fn() | ||
const memoizedFn = memoize(() => '_', mockFn) | ||
memoizedFn() | ||
memoizedFn.clear() | ||
memoizedFn() | ||
expect(mockFn).toHaveBeenCalledTimes(2) | ||
}) | ||
test('evict LRU calls', () => { | ||
const mockFn = jest.fn() | ||
const memoizedFn = memoize((n) => n, mockFn, { capacity: 1 }) | ||
memoizedFn(1) | ||
memoizedFn(2) | ||
memoizedFn(1) | ||
expect(mockFn).toHaveBeenCalledTimes(3) | ||
expect(mockFn).toHaveBeenLastCalledWith(1) | ||
}) |
Sorry, the diff of this file is not supported yet
Sorry, the diff of this file is not supported yet
11408
12.29%132
38.95%1
Infinity%+ Added
+ Added