Comparing version 4.1.1 to 4.1.2
@@ -138,3 +138,3 @@ (function (global, factory) { | ||
if (matchingEntry) { | ||
return matchingEntry.value; | ||
value = matchingEntry.value; | ||
} | ||
@@ -176,3 +176,2 @@ } | ||
// (memoize: MemoizeFunction, ...memoizeOptions: MemoizerOptions) { | ||
var createSelector = function createSelector() { | ||
@@ -179,0 +178,0 @@ for (var _len2 = arguments.length, funcs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { |
@@ -1,1 +0,1 @@ | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Reselect={})}(this,(function(e){"use strict";var t="NOT_FOUND";var n=function(e,t){return e===t};function r(e,r){var u,o,i="object"==typeof r?r:{equalityCheck:r},c=i.equalityCheck,f=i.maxSize,a=void 0===f?1:f,l=i.resultEqualityCheck,p=function(e){return function(t,n){if(null===t||null===n||t.length!==n.length)return!1;for(var r=t.length,u=0;r>u;u++)if(!e(t[u],n[u]))return!1;return!0}}(void 0===c?n:c),s=1===a?(u=p,{get:function(e){return o&&u(o.key,e)?o.value:t},put:function(e,t){o={key:e,value:t}},getEntries:function(){return o?[o]:[]},clear:function(){o=void 0}}):function(e,n){var r=[];function u(e){var u=r.findIndex((function(t){return n(e,t.key)}));if(u>-1){var o=r[u];return u>0&&(r.splice(u,1),r.unshift(o)),o.value}return t}return{get:u,put:function(n,o){u(n)===t&&(r.unshift({key:n,value:o}),r.length>e&&r.pop())},getEntries:function(){return r},clear:function(){r=[]}}}(a,p);function v(){var n=s.get(arguments);if(n===t){if(n=e.apply(null,arguments),l){var r=s.getEntries(),u=r.find((function(e){return l(e.value,n)}));if(u)return u.value}s.put(arguments,n)}return n}return v.clearCache=function(){return s.clear()},v}function u(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every((function(e){return"function"==typeof e}))){var n=t.map((function(e){return"function"==typeof e?"function "+(e.name||"unnamed")+"()":typeof e})).join(", ");throw Error("createSelector expects all input-selectors to be functions, but received the following types: ["+n+"]")}return t}function o(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;t>r;r++)n[r-1]=arguments[r];var o=function(){for(var t=arguments.length,r=Array(t),o=0;t>o;o++)r[o]=arguments[o];var i,c=0,f={memoizeOptions:void 0},a=r.pop();if("object"==typeof a&&(f=a,a=r.pop()),"function"!=typeof a)throw Error("createSelector expects an output function after the inputs, but received: ["+typeof a+"]");var l=f,p=l.memoizeOptions,s=void 0===p?n:p,v=Array.isArray(s)?s:[s],y=u(r),d=e.apply(void 0,[function(){return c++,a.apply(null,arguments)}].concat(v)),h=e((function(){for(var e=[],t=y.length,n=0;t>n;n++)e.push(y[n].apply(null,arguments));return i=d.apply(null,e)}));return Object.assign(h,{resultFunc:a,memoizedResultFunc:d,dependencies:y,lastResult:function(){return i},recomputations:function(){return c},resetRecomputations:function(){return c=0}}),h};return o}var i=o(r);e.createSelector=i,e.createSelectorCreator=o,e.createStructuredSelector=function(e,t){if(void 0===t&&(t=i),"object"!=typeof e)throw Error("createStructuredSelector expects first argument to be an object where each property is a selector, instead received a "+typeof e);var n=Object.keys(e);return t(n.map((function(t){return e[t]})),(function(){for(var e=arguments.length,t=Array(e),r=0;e>r;r++)t[r]=arguments[r];return t.reduce((function(e,t,r){return e[n[r]]=t,e}),{})}))},e.defaultEqualityCheck=n,e.defaultMemoize=r,Object.defineProperty(e,"__esModule",{value:!0})})); | ||
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).Reselect={})}(this,(function(e){"use strict";var t="NOT_FOUND";var n=function(e,t){return e===t};function r(e,r){var u,o,i="object"==typeof r?r:{equalityCheck:r},c=i.equalityCheck,f=i.maxSize,a=void 0===f?1:f,l=i.resultEqualityCheck,p=function(e){return function(t,n){if(null===t||null===n||t.length!==n.length)return!1;for(var r=t.length,u=0;r>u;u++)if(!e(t[u],n[u]))return!1;return!0}}(void 0===c?n:c),s=1===a?(u=p,{get:function(e){return o&&u(o.key,e)?o.value:t},put:function(e,t){o={key:e,value:t}},getEntries:function(){return o?[o]:[]},clear:function(){o=void 0}}):function(e,n){var r=[];function u(e){var u=r.findIndex((function(t){return n(e,t.key)}));if(u>-1){var o=r[u];return u>0&&(r.splice(u,1),r.unshift(o)),o.value}return t}return{get:u,put:function(n,o){u(n)===t&&(r.unshift({key:n,value:o}),r.length>e&&r.pop())},getEntries:function(){return r},clear:function(){r=[]}}}(a,p);function v(){var n=s.get(arguments);if(n===t){if(n=e.apply(null,arguments),l){var r=s.getEntries(),u=r.find((function(e){return l(e.value,n)}));u&&(n=u.value)}s.put(arguments,n)}return n}return v.clearCache=function(){return s.clear()},v}function u(e){var t=Array.isArray(e[0])?e[0]:e;if(!t.every((function(e){return"function"==typeof e}))){var n=t.map((function(e){return"function"==typeof e?"function "+(e.name||"unnamed")+"()":typeof e})).join(", ");throw Error("createSelector expects all input-selectors to be functions, but received the following types: ["+n+"]")}return t}function o(e){for(var t=arguments.length,n=Array(t>1?t-1:0),r=1;t>r;r++)n[r-1]=arguments[r];var o=function(){for(var t=arguments.length,r=Array(t),o=0;t>o;o++)r[o]=arguments[o];var i,c=0,f={memoizeOptions:void 0},a=r.pop();if("object"==typeof a&&(f=a,a=r.pop()),"function"!=typeof a)throw Error("createSelector expects an output function after the inputs, but received: ["+typeof a+"]");var l=f,p=l.memoizeOptions,s=void 0===p?n:p,v=Array.isArray(s)?s:[s],y=u(r),d=e.apply(void 0,[function(){return c++,a.apply(null,arguments)}].concat(v)),h=e((function(){for(var e=[],t=y.length,n=0;t>n;n++)e.push(y[n].apply(null,arguments));return i=d.apply(null,e)}));return Object.assign(h,{resultFunc:a,memoizedResultFunc:d,dependencies:y,lastResult:function(){return i},recomputations:function(){return c},resetRecomputations:function(){return c=0}}),h};return o}var i=o(r);e.createSelector=i,e.createSelectorCreator=o,e.createStructuredSelector=function(e,t){if(void 0===t&&(t=i),"object"!=typeof e)throw Error("createStructuredSelector expects first argument to be an object where each property is a selector, instead received a "+typeof e);var n=Object.keys(e);return t(n.map((function(t){return e[t]})),(function(){for(var e=arguments.length,t=Array(e),r=0;e>r;r++)t[r]=arguments[r];return t.reduce((function(e,t,r){return e[n[r]]=t,e}),{})}))},e.defaultEqualityCheck=n,e.defaultMemoize=r,Object.defineProperty(e,"__esModule",{value:!0})})); |
@@ -132,3 +132,3 @@ // Cache implementation based on Erik Rasmussen's `lru-memoize`: | ||
if (matchingEntry) { | ||
return matchingEntry.value; | ||
value = matchingEntry.value; | ||
} | ||
@@ -135,0 +135,0 @@ } |
@@ -1,2 +0,2 @@ | ||
import type { Selector, GetParamsFromSelectors, OutputSelector, EqualityFn, SelectorArray, SelectorResultArray } from './types'; | ||
import type { Selector, GetParamsFromSelectors, OutputSelector, EqualityFn, SelectorArray, SelectorResultArray, DropFirst } from './types'; | ||
export type { Selector, GetParamsFromSelectors, OutputSelector, EqualityFn, SelectorArray, SelectorResultArray, ParametricSelector, OutputParametricSelector } from './types'; | ||
@@ -6,4 +6,9 @@ import { defaultMemoize, defaultEqualityCheck, DefaultMemoizeOptions } from './defaultMemoize'; | ||
export type { DefaultMemoizeOptions }; | ||
declare type DropFirst<T extends unknown[]> = T extends [unknown, ...infer U] ? U : never; | ||
export declare function createSelectorCreator<F extends (...args: unknown[]) => unknown, MemoizeFunction extends (func: F, ...options: any[]) => F, MemoizeOptions extends unknown[] = DropFirst<Parameters<MemoizeFunction>>>(memoize: MemoizeFunction, ...memoizeOptionsFromArgs: DropFirst<Parameters<MemoizeFunction>>): CreateSelectorFunction<F, MemoizeFunction, MemoizeOptions>; | ||
export declare function createSelectorCreator< | ||
/** Selectors will eventually accept some function to be memoized */ | ||
F extends (...args: unknown[]) => unknown, | ||
/** A memoizer such as defaultMemoize that accepts a function + some possible options */ | ||
MemoizeFunction extends (func: F, ...options: any[]) => F, | ||
/** The additional options arguments to the memoizer */ | ||
MemoizeOptions extends unknown[] = DropFirst<Parameters<MemoizeFunction>>>(memoize: MemoizeFunction, ...memoizeOptionsFromArgs: DropFirst<Parameters<MemoizeFunction>>): CreateSelectorFunction<F, MemoizeFunction, MemoizeOptions>; | ||
interface CreateSelectorOptions<MemoizeOptions extends unknown[]> { | ||
@@ -20,3 +25,3 @@ memoizeOptions: MemoizeOptions[0] | MemoizeOptions; | ||
(...args: SelectorResultArray<Selectors>) => Result | ||
]): OutputSelector<Selectors, Result, GetParamsFromSelectors<Selectors>, ((...args: SelectorResultArray<Selectors>) => Result) & ReturnType<MemoizeFunction>>; | ||
]): OutputSelector<Selectors, Result, ((...args: SelectorResultArray<Selectors>) => Result) & Pick<ReturnType<MemoizeFunction>, keyof ReturnType<MemoizeFunction>>, GetParamsFromSelectors<Selectors>> & Pick<ReturnType<MemoizeFunction>, keyof ReturnType<MemoizeFunction>>; | ||
/** Input selectors as separate inline arguments with memoizeOptions passed */ | ||
@@ -27,5 +32,5 @@ <Selectors extends SelectorArray, Result>(...items: [ | ||
CreateSelectorOptions<MemoizeOptions> | ||
]): OutputSelector<Selectors, Result, GetParamsFromSelectors<Selectors>, ((...args: SelectorResultArray<Selectors>) => Result) & ReturnType<MemoizeFunction>>; | ||
]): OutputSelector<Selectors, Result, ((...args: SelectorResultArray<Selectors>) => Result) & Pick<ReturnType<MemoizeFunction>, keyof ReturnType<MemoizeFunction>>, GetParamsFromSelectors<Selectors>> & Pick<ReturnType<MemoizeFunction>, keyof ReturnType<MemoizeFunction>>; | ||
/** Input selectors as a separate array */ | ||
<Selectors extends SelectorArray, Result>(selectors: [...Selectors], combiner: (...args: SelectorResultArray<Selectors>) => Result, options?: CreateSelectorOptions<MemoizeOptions>): OutputSelector<Selectors, Result, GetParamsFromSelectors<Selectors>, ((...args: SelectorResultArray<Selectors>) => Result) & ReturnType<MemoizeFunction>>; | ||
<Selectors extends SelectorArray, Result>(selectors: [...Selectors], combiner: (...args: SelectorResultArray<Selectors>) => Result, options?: CreateSelectorOptions<MemoizeOptions>): OutputSelector<Selectors, Result, ((...args: SelectorResultArray<Selectors>) => Result) & Pick<ReturnType<MemoizeFunction>, keyof ReturnType<MemoizeFunction>>, GetParamsFromSelectors<Selectors>> & Pick<ReturnType<MemoizeFunction>, keyof ReturnType<MemoizeFunction>>; | ||
} | ||
@@ -32,0 +37,0 @@ export declare const createSelector: CreateSelectorFunction<(...args: unknown[]) => unknown, typeof defaultMemoize, [equalityCheckOrOptions?: EqualityFn | DefaultMemoizeOptions | undefined]>; |
@@ -24,3 +24,2 @@ import { defaultMemoize, defaultEqualityCheck } from './defaultMemoize'; | ||
// (memoize: MemoizeFunction, ...memoizeOptions: MemoizerOptions) { | ||
var createSelector = function createSelector() { | ||
@@ -27,0 +26,0 @@ for (var _len2 = arguments.length, funcs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { |
@@ -1,11 +0,31 @@ | ||
export declare type Selector<S = any, R = unknown, P extends never | readonly any[] = any[]> = [P] extends [never] ? (state: S) => R : (state: S, ...params: P) => R; | ||
/** A standard selector function, which takes three generic type arguments: | ||
* @param State The first value, often a Redux root state object | ||
* @param Result The final result returned by the selector | ||
* @param Params All additional arguments passed into the selector | ||
*/ | ||
export declare type Selector<State = any, Result = unknown, Params extends never | readonly any[] = any[]> = [Params] extends [never] ? (state: State) => Result : (state: State, ...params: Params) => Result; | ||
/** Selectors generated by Reselect have several additional fields attached: */ | ||
interface OutputSelectorFields<Combiner, Result> { | ||
/** The final function passed to `createSelector` */ | ||
resultFunc: Combiner; | ||
/** The same function, memoized */ | ||
memoizedResultFunc: Combiner; | ||
/** Returns the last result calculated by the selector */ | ||
lastResult: () => Result; | ||
/** An array of the input selectors */ | ||
dependencies: SelectorArray; | ||
/** Counts the number of times the output has been recalculated */ | ||
recomputations: () => number; | ||
/** Resets the count of recomputations count to 0 */ | ||
resetRecomputations: () => number; | ||
} | ||
export declare type OutputSelector<S extends SelectorArray, Result, Params extends readonly any[], Combiner> = Selector<GetStateFromSelectors<S>, Result, Params> & OutputSelectorFields<Combiner, Result>; | ||
/** Represents the actual selectors generated by `createSelector`. | ||
* The selector is: | ||
* - "a function that takes this state + params and returns a result" | ||
* - plus the attached additional fields | ||
*/ | ||
export declare type OutputSelector<S extends SelectorArray, Result, Combiner, Params extends readonly any[] = never> = Selector<GetStateFromSelectors<S>, Result, Params> & OutputSelectorFields<Combiner, Result>; | ||
/** A selector that is assumed to have one additional argument, such as | ||
* the props from a React component | ||
*/ | ||
export declare type ParametricSelector<State, Props, Result> = Selector<State, Result, [ | ||
@@ -15,9 +35,25 @@ Props, | ||
]>; | ||
/** A generated selector that is assumed to have one additional argument */ | ||
export declare type OutputParametricSelector<State, Props, Result, Combiner> = ParametricSelector<State, Props, Result> & OutputSelectorFields<Combiner, Result>; | ||
/** An array of input selectors */ | ||
export declare type SelectorArray = ReadonlyArray<Selector>; | ||
/** Utility type to extract the State generic from a selector */ | ||
declare type GetStateFromSelector<S> = S extends Selector<infer State> ? State : never; | ||
/** Utility type to extract the State generic from multiple selectors at once, | ||
* to help ensure that all selectors correctly share the same State type and | ||
* avoid mismatched input selectors being provided. | ||
*/ | ||
export declare type GetStateFromSelectors<S extends SelectorArray> = S extends [infer C1, infer C2, ...infer Other] ? Other extends [any] ? GetStateFromSelector<C1> & GetStateFromSelector<C2> & GetStateFromSelectors<Other> : GetStateFromSelector<C1> & GetStateFromSelector<C2> : S extends [infer Current, ...infer Other] ? Other extends [any] ? GetStateFromSelector<Current> & GetStateFromSelectors<Other> : GetStateFromSelector<Current> : S extends (infer Elem)[] ? GetStateFromSelector<Elem> : never; | ||
/** Utility type to extract the Params generic from a selector */ | ||
export declare type GetParamsFromSelector<S> = S extends Selector<any, any, infer P> ? P extends [] ? never : P : never; | ||
/** Utility type to extract the Params generic from multiple selectors at once, | ||
* to help ensure that all selectors correctly share the same params and | ||
* avoid mismatched input selectors being provided. | ||
*/ | ||
export declare type GetParamsFromSelectors<S, Found = never> = S extends SelectorArray ? S extends (infer s)[] ? GetParamsFromSelector<s> : S extends [infer Current, ...infer Rest] ? GetParamsFromSelector<Current> extends [] ? GetParamsFromSelectors<Rest, Found> : GetParamsFromSelector<Current> : S : Found; | ||
/** Utility type to extract the return type from a selector */ | ||
declare type SelectorReturnType<S> = S extends Selector ? ReturnType<S> : never; | ||
/** Utility type to extract the Result generic from multiple selectors at once, | ||
* for use in calculating the arguments to the "result/combiner" function. | ||
*/ | ||
export declare type SelectorResultArray<Selectors extends SelectorArray, Rest extends SelectorArray = Selectors> = Rest extends [infer S1, infer S2, ...infer Remaining] ? Remaining extends SelectorArray ? [ | ||
@@ -28,3 +64,6 @@ SelectorReturnType<S1>, | ||
] : [SelectorReturnType<S1>, SelectorReturnType<S2>] : Rest extends [infer S, ...infer Remaining] ? Remaining extends SelectorArray ? [SelectorReturnType<S>, ...SelectorResultArray<Selectors, Remaining>] : [SelectorReturnType<S>] : Rest extends ((...args: any) => infer S)[] ? S[] : []; | ||
/** A standard function returning true if two values are considered equal */ | ||
export declare type EqualityFn = (a: any, b: any) => boolean; | ||
/** Utility type to infer the type of "all params of a function except the first", so we can determine what arguments a memoize function accepts */ | ||
export declare type DropFirst<T extends unknown[]> = T extends [unknown, ...infer U] ? U : never; | ||
export {}; |
@@ -144,3 +144,3 @@ "use strict"; | ||
if (matchingEntry) { | ||
return matchingEntry.value; | ||
value = matchingEntry.value; | ||
} | ||
@@ -147,0 +147,0 @@ } |
@@ -44,3 +44,2 @@ "use strict"; | ||
// (memoize: MemoizeFunction, ...memoizeOptions: MemoizerOptions) { | ||
var createSelector = function createSelector() { | ||
@@ -47,0 +46,0 @@ for (var _len2 = arguments.length, funcs = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) { |
{ | ||
"name": "reselect", | ||
"version": "4.1.1", | ||
"version": "4.1.2", | ||
"description": "Selectors for Redux.", | ||
@@ -5,0 +5,0 @@ "main": "./lib/index.js", |
@@ -37,3 +37,3 @@ # Reselect | ||
Reselect exports a `createSelector` API, which generates memoized selector functions. `createSelector` accepts one or more "input" selectors, which extra values from arguments, and an "output" selector that receives the extracted values and should return a derived value. If the generated selector is called multiple times, the output will only be recalculated when the extracted values have changed. | ||
Reselect exports a `createSelector` API, which generates memoized selector functions. `createSelector` accepts one or more "input" selectors, which extract values from arguments, and an "output" selector that receives the extracted values and should return a derived value. If the generated selector is called multiple times, the output will only be recalculated when the extracted values have changed. | ||
@@ -606,2 +606,8 @@ You can play around with the following **example** in [this CodeSandbox](https://codesandbox.io/s/objective-waterfall-1z5y8?file=/src/index.js): | ||
### Q: I am seeing a TypeScript error: `Type instantiation is excessively deep and possibly infinite` | ||
A: This can often occur with deeply recursive types, which occur in this library. Please see [this | ||
comment](https://github.com/reduxjs/reselect/issues/534#issuecomment-956708953) for a discussion of the problem, as | ||
relating to nested selectors. | ||
### Q: How can I make a [curried](https://github.com/hemanth/functional-programming-jargon#currying) selector? | ||
@@ -608,0 +614,0 @@ |
@@ -159,3 +159,3 @@ import type { EqualityFn } from './types' | ||
if (matchingEntry) { | ||
return matchingEntry.value | ||
value = matchingEntry.value | ||
} | ||
@@ -162,0 +162,0 @@ } |
@@ -7,3 +7,4 @@ import type { | ||
SelectorArray, | ||
SelectorResultArray | ||
SelectorResultArray, | ||
DropFirst | ||
} from './types' | ||
@@ -52,9 +53,8 @@ | ||
type DropFirst<T extends unknown[]> = T extends [unknown, ...infer U] | ||
? U | ||
: never | ||
export function createSelectorCreator< | ||
/** Selectors will eventually accept some function to be memoized */ | ||
F extends (...args: unknown[]) => unknown, | ||
/** A memoizer such as defaultMemoize that accepts a function + some possible options */ | ||
MemoizeFunction extends (func: F, ...options: any[]) => F, | ||
/** The additional options arguments to the memoizer */ | ||
MemoizeOptions extends unknown[] = DropFirst<Parameters<MemoizeFunction>> | ||
@@ -65,3 +65,2 @@ >( | ||
) { | ||
// (memoize: MemoizeFunction, ...memoizeOptions: MemoizerOptions) { | ||
const createSelector = (...funcs: Function[]) => { | ||
@@ -174,6 +173,7 @@ let recomputations = 0 | ||
Result, | ||
GetParamsFromSelectors<Selectors>, | ||
((...args: SelectorResultArray<Selectors>) => Result) & | ||
ReturnType<MemoizeFunction> | ||
> | ||
Pick<ReturnType<MemoizeFunction>, keyof ReturnType<MemoizeFunction>>, | ||
GetParamsFromSelectors<Selectors> | ||
> & | ||
Pick<ReturnType<MemoizeFunction>, keyof ReturnType<MemoizeFunction>> | ||
@@ -190,6 +190,7 @@ /** Input selectors as separate inline arguments with memoizeOptions passed */ | ||
Result, | ||
GetParamsFromSelectors<Selectors>, | ||
((...args: SelectorResultArray<Selectors>) => Result) & | ||
ReturnType<MemoizeFunction> | ||
> | ||
Pick<ReturnType<MemoizeFunction>, keyof ReturnType<MemoizeFunction>>, | ||
GetParamsFromSelectors<Selectors> | ||
> & | ||
Pick<ReturnType<MemoizeFunction>, keyof ReturnType<MemoizeFunction>> | ||
@@ -204,6 +205,7 @@ /** Input selectors as a separate array */ | ||
Result, | ||
GetParamsFromSelectors<Selectors>, | ||
((...args: SelectorResultArray<Selectors>) => Result) & | ||
ReturnType<MemoizeFunction> | ||
> | ||
Pick<ReturnType<MemoizeFunction>, keyof ReturnType<MemoizeFunction>>, | ||
GetParamsFromSelectors<Selectors> | ||
> & | ||
Pick<ReturnType<MemoizeFunction>, keyof ReturnType<MemoizeFunction>> | ||
} | ||
@@ -210,0 +212,0 @@ |
@@ -0,24 +1,51 @@ | ||
/** A standard selector function, which takes three generic type arguments: | ||
* @param State The first value, often a Redux root state object | ||
* @param Result The final result returned by the selector | ||
* @param Params All additional arguments passed into the selector | ||
*/ | ||
export type Selector< | ||
S = any, | ||
R = unknown, | ||
P extends never | readonly any[] = any[] | ||
> = [P] extends [never] ? (state: S) => R : (state: S, ...params: P) => R | ||
// The state can be anything | ||
State = any, | ||
// The result will be inferred | ||
Result = unknown, | ||
// There are either 0 params, or N params | ||
Params extends never | readonly any[] = any[] | ||
// If there are 0 params, type the function as just State in, Result out. | ||
// Otherwise, type it as State + Params in, Result out. | ||
> = [Params] extends [never] | ||
? (state: State) => Result | ||
: (state: State, ...params: Params) => Result | ||
/** Selectors generated by Reselect have several additional fields attached: */ | ||
interface OutputSelectorFields<Combiner, Result> { | ||
/** The final function passed to `createSelector` */ | ||
resultFunc: Combiner | ||
/** The same function, memoized */ | ||
memoizedResultFunc: Combiner | ||
/** Returns the last result calculated by the selector */ | ||
lastResult: () => Result | ||
/** An array of the input selectors */ | ||
dependencies: SelectorArray | ||
/** Counts the number of times the output has been recalculated */ | ||
recomputations: () => number | ||
/** Resets the count of recomputations count to 0 */ | ||
resetRecomputations: () => number | ||
} | ||
/** Represents the actual selectors generated by `createSelector`. | ||
* The selector is: | ||
* - "a function that takes this state + params and returns a result" | ||
* - plus the attached additional fields | ||
*/ | ||
export type OutputSelector< | ||
S extends SelectorArray, | ||
Result, | ||
Params extends readonly any[], | ||
Combiner | ||
Combiner, | ||
Params extends readonly any[] = never | ||
> = Selector<GetStateFromSelectors<S>, Result, Params> & | ||
OutputSelectorFields<Combiner, Result> | ||
/** A selector that is assumed to have one additional argument, such as | ||
* the props from a React component | ||
*/ | ||
export type ParametricSelector<State, Props, Result> = Selector< | ||
@@ -30,2 +57,3 @@ State, | ||
/** A generated selector that is assumed to have one additional argument */ | ||
export type OutputParametricSelector<State, Props, Result, Combiner> = | ||
@@ -35,5 +63,12 @@ ParametricSelector<State, Props, Result> & | ||
/** An array of input selectors */ | ||
export type SelectorArray = ReadonlyArray<Selector> | ||
/** Utility type to extract the State generic from a selector */ | ||
type GetStateFromSelector<S> = S extends Selector<infer State> ? State : never | ||
/** Utility type to extract the State generic from multiple selectors at once, | ||
* to help ensure that all selectors correctly share the same State type and | ||
* avoid mismatched input selectors being provided. | ||
*/ | ||
export type GetStateFromSelectors<S extends SelectorArray> = | ||
@@ -55,2 +90,3 @@ // handle two elements at once so this type works for up to 30 selectors | ||
/** Utility type to extract the Params generic from a selector */ | ||
export type GetParamsFromSelector<S> = S extends Selector<any, any, infer P> | ||
@@ -61,2 +97,7 @@ ? P extends [] | ||
: never | ||
/** Utility type to extract the Params generic from multiple selectors at once, | ||
* to help ensure that all selectors correctly share the same params and | ||
* avoid mismatched input selectors being provided. | ||
*/ | ||
export type GetParamsFromSelectors<S, Found = never> = S extends SelectorArray | ||
@@ -72,4 +113,8 @@ ? S extends (infer s)[] | ||
/** Utility type to extract the return type from a selector */ | ||
type SelectorReturnType<S> = S extends Selector ? ReturnType<S> : never | ||
/** Utility type to extract the Result generic from multiple selectors at once, | ||
* for use in calculating the arguments to the "result/combiner" function. | ||
*/ | ||
export type SelectorResultArray< | ||
@@ -96,2 +141,8 @@ Selectors extends SelectorArray, | ||
/** A standard function returning true if two values are considered equal */ | ||
export type EqualityFn = (a: any, b: any) => boolean | ||
/** Utility type to infer the type of "all params of a function except the first", so we can determine what arguments a memoize function accepts */ | ||
export type DropFirst<T extends unknown[]> = T extends [unknown, ...infer U] | ||
? U | ||
: never |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
4592
659
154134
16