Skip to content

⬅️ Back to Table of Contents

📄 useMemoize

📊 Analysis Summary

Metric Count
🔧 Functions 8
📦 Imports 1
📐 Interfaces 3
📑 Type Aliases 1

📚 Table of Contents

🛠️ File Location:

📂 packages/core/useMemoize/index.ts

📦 Imports

Name Source
shallowReactive vue

Functions

useMemoize(resolver: (...args: Args) => Result, options: UseMemoizeOptions<Result, Args>): UseMemoizeReturn<Result, Args>

Reactive function result cache based on arguments

Tags: @__NO_SIDE_EFFECTS__

Raw JSDoc
/**
 * Reactive function result cache based on arguments
 *
 * @__NO_SIDE_EFFECTS__
 */

Calls:

  • shallowReactive (from vue)
  • initCache
  • options.getKey
  • JSON.stringify
  • cache.set
  • resolver
  • cache.get
  • _loadData
  • generateKey
  • cache.delete
  • cache.clear
  • cache.has

Internal Comments:

/**
   * Generate key from args
   */ (x2)
// Default key: Serialize args
/**
   * Load data and save in cache
   */ (x2)
/**
   * Delete key from cache
   */ (x2)
/**
   * Clear cached data
   */ (x2)
// Get data from cache (x2)

Code
export function useMemoize<Result, Args extends unknown[]>(
  resolver: (...args: Args) => Result,
  options?: UseMemoizeOptions<Result, Args>,
): UseMemoizeReturn<Result, Args> {
  const initCache = (): UseMemoizeCache<CacheKey, Result> => {
    if (options?.cache)
      return shallowReactive(options.cache)
    return shallowReactive(new Map<CacheKey, Result>())
  }
  const cache = initCache()

  /**
   * Generate key from args
   */
  const generateKey = (...args: Args) => options?.getKey
    ? options.getKey(...args)
    // Default key: Serialize args
    : JSON.stringify(args)

  /**
   * Load data and save in cache
   */
  const _loadData = (key: string | number, ...args: Args): Result => {
    cache.set(key, resolver(...args))
    return cache.get(key) as Result
  }
  const loadData = (...args: Args): Result => _loadData(generateKey(...args), ...args)

  /**
   * Delete key from cache
   */
  const deleteData = (...args: Args): void => {
    cache.delete(generateKey(...args))
  }

  /**
   * Clear cached data
   */
  const clearData = () => {
    cache.clear()
  }

  const memoized: Partial<UseMemoizeReturn<Result, Args>> = (...args: Args): Result => {
    // Get data from cache
    const key = generateKey(...args)
    if (cache.has(key))
      return cache.get(key) as Result
    return _loadData(key, ...args)
  }
  memoized.load = loadData
  memoized.delete = deleteData
  memoized.clear = clearData
  memoized.generateKey = generateKey
  memoized.cache = cache

  return memoized as UseMemoizeReturn<Result, Args>
}

Internal helpers

Declared inside another function in this file.

initCache(): UseMemoizeCache<CacheKey, Result>

Returns: UseMemoizeCache<CacheKey, Result>

Calls:

  • shallowReactive (from vue)
Code
(): UseMemoizeCache<CacheKey, Result> => {
    if (options?.cache)
      return shallowReactive(options.cache)
    return shallowReactive(new Map<CacheKey, Result>())
  }

generateKey(args: Args): string | number

Parameters:

  • args Args

Returns: string | number

Code
(...args: Args) => options?.getKey
    ? options.getKey(...args)
    // Default key: Serialize args
    : JSON.stringify(args)

_loadData(key: string | number, args: Args): Result

Parameters:

  • key string | number
  • args Args

Returns: Result

Calls:

  • cache.set
  • resolver
  • cache.get
Code
(key: string | number, ...args: Args): Result => {
    cache.set(key, resolver(...args))
    return cache.get(key) as Result
  }

loadData(args: Args): Result

Parameters:

  • args Args

Returns: Result

Calls:

  • _loadData
Code
(...args: Args): Result => _loadData(generateKey(...args), ...args)

deleteData(args: Args): void

Parameters:

  • args Args

Returns: void

Calls:

  • cache.delete
  • generateKey
Code
(...args: Args): void => {
    cache.delete(generateKey(...args))
  }

clearData(): void

Returns: void

Calls:

  • cache.clear
Code
() => {
    cache.clear()
  }

memoized(args: Args): Result

Parameters:

  • args Args

Returns: Result

Calls:

  • generateKey
  • cache.has
  • cache.get
  • _loadData

Internal Comments:

// Get data from cache (x2)

Code
(...args: Args): Result => {
    // Get data from cache
    const key = generateKey(...args)
    if (cache.has(key))
      return cache.get(key) as Result
    return _loadData(key, ...args)
  }

Interfaces

UseMemoizeCache<Key, Value>

Interface Code
export interface UseMemoizeCache<Key, Value> {
  /**
   * Get value for key
   */
  get: (key: Key) => Value | undefined
  /**
   * Set value for key
   */
  set: (key: Key, value: Value) => void
  /**
   * Return flag if key exists
   */
  has: (key: Key) => boolean
  /**
   * Delete value for key
   */
  delete: (key: Key) => void
  /**
   * Clear cache
   */
  clear: () => void
}

Properties

Name Type Optional Description
get (key: Key) => Value \| undefined not shown
set (key: Key, value: Value) => void not shown
has (key: Key) => boolean not shown
delete (key: Key) => void not shown
clear () => void not shown

UseMemoizeReturn<Result, Args extends unknown[]>

Interface Code
export interface UseMemoizeReturn<Result, Args extends unknown[]> {
  /**
   * Get result from cache or call memoized function
   */
  (...args: Args): Result
  /**
   * Call memoized function and update cache
   */
  load: (...args: Args) => Result
  /**
   * Delete cache of given arguments
   */
  delete: (...args: Args) => void
  /**
   * Clear cache
   */
  clear: () => void
  /**
   * Generate cache key for given arguments
   */
  generateKey: (...args: Args) => CacheKey
  /**
   * Cache container
   */
  cache: UseMemoizeCache<CacheKey, Result>
}

Properties

Name Type Optional Description
load (...args: Args) => Result not shown
delete (...args: Args) => void not shown
clear () => void not shown
generateKey (...args: Args) => CacheKey not shown
cache UseMemoizeCache<CacheKey, Result> not shown

UseMemoizeOptions<Result, Args extends unknown[]>

Interface Code
export interface UseMemoizeOptions<Result, Args extends unknown[]> {
  getKey?: (...args: Args) => string | number
  cache?: UseMemoizeCache<CacheKey, Result>
}

Properties

Name Type Optional Description
getKey (...args: Args) => string \| number not shown
cache UseMemoizeCache<CacheKey, Result> not shown

Type Aliases

CacheKey

type CacheKey = any;

Generated by Syntax Scribe