type Func = (...args: any[]) => any; export interface Cache { create: CacheCreateFunc; } interface CacheCreateFunc { (): DefaultCache; } interface DefaultCache { 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 | ((arg: any) => any); 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 {};