@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
JavaScript
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