import type { CommonLogger } from '../log/commonLogger.js'; import type { AnyFunction, AnyObject, MaybeParameters } from '../types.js'; import type { MethodDecorator } from './decorator.util.js'; import type { MemoCache } from './memo.util.js'; export interface MemoOptions { /** * Provide a custom implementation of MemoCache. * Function that creates an instance of `MemoCache`. * e.g LRUMemoCache from `@naturalcycles/nodejs-lib` */ cacheFactory?: () => MemoCache; /** * Provide a custom implementation of CacheKey function. */ cacheKeyFn?: (args: MaybeParameters) => any; /** * Default to `console` */ logger?: CommonLogger; } export interface MemoInstance { /** * Clears the cache. */ clear: () => void; getInstanceCache: () => Map; getCache: (instance: AnyFunction) => MemoCache | undefined; } /** * Memoizes the method of the class, so it caches the output and returns the cached version if the "key" * of the cache is the same. Key, by defaul, is calculated as `JSON.stringify(...args)`. * Cache is stored indefinitely in the internal Map. * * If origin function throws an Error - it is NOT cached. * So, error-throwing functions will be called multiple times. * Therefor, if the origin function can possibly throw - it should try to be idempotent. * * Cache is stored **per instance** - separate cache for separate instances of the class. * If you don't want it that way - you can use a static method, then there will be only one "instance". * * Supports dropping it's cache by calling .clear() method of decorated function (useful in unit testing). * * Based on: * https://github.com/mgechev/memo-decorator/blob/master/index.ts * http://decodize.com/blog/2012/08/27/javascript-memoization-caching-results-for-better-performance/ * http://inlehmansterms.net/2015/03/01/javascript-memoization/ * https://community.risingstack.com/the-worlds-fastest-javascript-memoization-library/ */ export declare const _Memo: (opt?: MemoOptions) => MethodDecorator; /** Call it on a method that is decorated with `@_Memo` to get access to additional functions, e.g `clear` to clear the cache, or get its underlying data. */ export declare function _getMemo(method: AnyFunction): MemoInstance;