Skip to content

Commit

Permalink
increase subselector number
Browse files Browse the repository at this point in the history
  • Loading branch information
phryneas committed Oct 26, 2021
1 parent 508e0dd commit 4ead716
Show file tree
Hide file tree
Showing 2 changed files with 100 additions and 16 deletions.
44 changes: 29 additions & 15 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,18 +34,22 @@ export type OutputParametricSelector<State, Props, Result, Combiner> =
export type SelectorArray = ReadonlyArray<Selector>

type GetStateFromSelector<S> = S extends Selector<infer State> ? State : never
type GetStateFromSelectors<S extends SelectorArray> = S extends [
infer Current,
...infer Other
]
? Current extends Selector
export type GetStateFromSelectors<S extends SelectorArray> =
// handle two elements at once so this type works for up to 30 selectors
S extends [infer C1, infer C2, ...infer Other]
? Other extends SelectorArray
?
| GetStateFromSelector<C1>
| GetStateFromSelector<C2>
| GetStateFromSelectors<Other>
: GetStateFromSelector<C1> | GetStateFromSelector<C2>
: S extends [infer Current, ...infer Other]
? Other extends SelectorArray
? GetStateFromSelector<Current> | GetStateFromSelectors<Other>
: GetStateFromSelector<Current>
: S extends (infer Elem)[]
? GetStateFromSelector<Elem>
: never
: S extends (infer Elem)[]
? GetStateFromSelector<Elem>
: never

export type GetParamsFromSelector<S> = S extends Selector<any, any, infer P>
? P extends []
Expand All @@ -62,17 +66,27 @@ export type GetParamsFromSelectors<S, Found = never> = S extends SelectorArray
: S
: Found

type SelectorReturnType<S> = S extends Selector ? ReturnType<S> : never

export type SelectorResultArray<
Selectors extends SelectorArray,
Rest extends SelectorArray = Selectors
> = Rest extends [infer S, ...infer Remaining]
? S extends Selector
> =
// handle two elements at once so this type works for up to 29 selectors, not only up to 15
Rest extends [infer S1, infer S2, ...infer Remaining]
? Remaining extends SelectorArray
? [
SelectorReturnType<S1>,
SelectorReturnType<S2>,
...SelectorResultArray<Selectors, Remaining>
]
: [SelectorReturnType<S1>, SelectorReturnType<S2>]
: Rest extends [infer S, ...infer Remaining]
? Remaining extends SelectorArray
? [ReturnType<S>, ...SelectorResultArray<Selectors, Remaining>]
: [ReturnType<S>]
? [SelectorReturnType<S>, ...SelectorResultArray<Selectors, Remaining>]
: [SelectorReturnType<S>]
: Rest extends ((...args: any) => infer S)[]
? S[]
: []
: Rest extends ((...args: any) => infer S)[]
? S[]
: []

export type EqualityFn = (a: any, b: any) => boolean
72 changes: 71 additions & 1 deletion typescript_test/test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,9 @@ import {
createSelectorCreator,
createStructuredSelector,
ParametricSelector,
OutputSelector
OutputSelector,
SelectorResultArray,
GetParamsFromSelectors
} from '../src/index'

import microMemoize from 'micro-memoize'
Expand Down Expand Up @@ -717,6 +719,7 @@ function multiArgMemoize<F extends (...args: any[]) => any>(

// #384: check for defaultMemoize
import { isEqual, groupBy } from 'lodash'
import { GetStateFromSelectors } from '../src/types'

{
interface Transaction {
Expand Down Expand Up @@ -990,3 +993,70 @@ function createSelectorConfigOptions() {
}
)
}

const withLotsOfInputSelectors = createSelector(
(_state: any) => 1,
(_state: any) => 2,
(_state: any) => 3,
(_state: any) => 4,
(_state: any) => 5,
(_state: any) => 6,
(_state: any) => 7,
(_state: any) => 8,
(_state: any) => 9,
(_state: any) => 10,
(_state: any) => 11,
(_state: any) => 12,
(_state: any) => 13,
(_state: any) => 14,
(_state: any) => 15,
(_state: any) => 16,
(_state: any) => 17,
(_state: any) => 18,
(_state: any) => 19,
(_state: any) => 20,
(_state: any) => 21,
(_state: any) => 22,
(_state: any) => 23,
(_state: any) => 24,
(_state: any) => 25,
(_state: any) => 26,
(_state: any) => 27,
(_state: any) => 28,
(...args) => args.length
)

type SelectorArray29 = [
(_state: any) => 1,
(_state: any) => 2,
(_state: any) => 3,
(_state: any) => 4,
(_state: any) => 5,
(_state: any) => 6,
(_state: any) => 7,
(_state: any) => 8,
(_state: any) => 9,
(_state: any) => 10,
(_state: any) => 11,
(_state: any) => 12,
(_state: any) => 13,
(_state: any) => 14,
(_state: any) => 15,
(_state: any) => 16,
(_state: any) => 17,
(_state: any) => 18,
(_state: any) => 19,
(_state: any) => 20,
(_state: any) => 21,
(_state: any) => 22,
(_state: any) => 23,
(_state: any) => 24,
(_state: any) => 25,
(_state: any) => 26,
(_state: any) => 27,
(_state: any) => 28,
(_state: any) => 29
]

type Results = SelectorResultArray<SelectorArray29>
type State = GetStateFromSelectors<SelectorArray29>

0 comments on commit 4ead716

Please sign in to comment.