@jeremyckahn/farmhand
Version:
A farming game
56 lines (46 loc) • 1.55 kB
JavaScript
/** @typedef {import("fast-memoize").Options} MemoizeOptions */
import fastMemoize from 'fast-memoize'
import { MEMOIZE_CACHE_CLEAR_THRESHOLD } from '../constants.js'
// This is basically the same as fast-memoize's default cache, except that it
// clears the cache once the size exceeds MEMOIZE_CACHE_CLEAR_THRESHOLD to
// prevent memory bloat.
// https://github.com/caiogondim/fast-memoize.js/blob/5cdfc8dde23d86b16e0104bae1b04cd447b98c63/src/index.js#L114-L128
/**
* @ignore
*/
export class MemoizeCache {
cache = {}
/**
* @param {Object} [config] Can also contain the config options used to
* configure fast-memoize.
* @param {number} [config.cacheSize]
* @see https://github.com/caiogondim/fast-memoize.js
*/
constructor({ cacheSize = MEMOIZE_CACHE_CLEAR_THRESHOLD } = {}) {
this.cacheSize = cacheSize
}
has(key) {
return key in this.cache
}
get(key) {
return this.cache[key]
}
set(key, value) {
if (Object.keys(this.cache).length > this.cacheSize) {
this.cache = {}
}
this.cache[key] = value
}
}
/**
* @template {(...args: any[]) => any} T Copied from https://github.com/caiogondim/fast-memoize.js/blob/5cdfc8dde23d86b16e0104bae1b04cd447b98c63/typings/fast-memoize.d.ts#L1
* @param {T} fn
* @param {MemoizeOptions & Partial<{ cacheSize: number }>} [config]
* @returns T
* @see https://github.com/caiogondim/fast-memoize.js
*/
export const memoize = (fn, config) =>
fastMemoize(fn, {
cache: { create: () => new MemoizeCache(config) },
...config,
})