UNPKG

@ngneers/easy-ngrx-distinct-selector

Version:

Provides functions to easily create @ngrx/store selectors with equal functions for arguments and result values.

45 lines 1.66 kB
import { defaultArrayEqualsFn, defaultEqualsFn } from './is-equal'; /** * Uses the same logic as the `defaultMemoize` function from `@ngrx/store`. * The difference is that the `isArgumentsEqual` function is now called only once with the previous and current arguments instead of once for each argument. * This enables us to write better TypeScript types for the `isArgumentsEqual` function. * * @see https://ngrx.io/api/store/defaultMemoize */ export function typeFriendlyDefaultMemoize(projectionFn, isArgumentsEqual = defaultArrayEqualsFn, isResultEqual = defaultEqualsFn) { let lastArguments = null; let lastResult = null; let overrideResult; function reset() { lastArguments = null; lastResult = null; } function setResult(result) { overrideResult = result === undefined ? undefined : { result }; } function clearResult() { overrideResult = undefined; } function memoized(...args) { if (overrideResult !== undefined) { return overrideResult.result; } if (!lastArguments) { lastResult = projectionFn(...args); lastArguments = args; return lastResult; } if (isArgumentsEqual(args, lastArguments)) { return lastResult; } const newResult = projectionFn(...args); lastArguments = args; if (isResultEqual(lastResult, newResult)) { return lastResult; } lastResult = newResult; return newResult; } return { memoized, reset, setResult, clearResult }; } //# sourceMappingURL=type-friendly-default-memoize.js.map