type Func = (...args: any[]) => any; export interface Cache< K, V > { create: CacheCreateFunc; } interface CacheCreateFunc< K, V > { (): DefaultCache; } interface DefaultCache< K, V > { get(key: K): V | undefined; set(key: K, value: V | undefined): void; } export type Serializer = (args: any[]) => string; export interface Options { cache?: Cache>; serializer?: Serializer; strategy?: MemoizeFunc; } export interface ResolvedOptions { cache: Cache>; serializer: Serializer; } export interface MemoizeFunc { (fn: F, options?: Options): F; } export declare function memoize(fn: F, options?: Options): F; export type StrategyFn = (this: unknown, fn: F, cache: DefaultCache>, serializer: Serializer, arg: any) => any; export interface Strategies { variadic: MemoizeFunc; monadic: MemoizeFunc; } export declare const strategies: Strategies; export {};