Skip to content

Commit

Permalink
Fix runtime implementation of the new version of createSelectorCreator
Browse files Browse the repository at this point in the history
  • Loading branch information
aryaemami59 committed Oct 4, 2023
1 parent 93be6fe commit 8ad544e
Show file tree
Hide file tree
Showing 6 changed files with 1,122 additions and 105 deletions.
16 changes: 15 additions & 1 deletion src/types.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
import { CreateSelectorOptions } from 'reselect'
import type { MergeParameters } from './versionedTypes'
export type { MergeParameters } from './versionedTypes'

Expand Down Expand Up @@ -120,11 +119,26 @@ export type UnknownMemoizer<Func extends UnknownFunction = UnknownFunction> = (
...options: any[]
) => Func

/**
* Omit any index signatures from the given object type, leaving only explicitly defined properties.
* Source: https://stackoverflow.com/questions/51465182/how-to-remove-index-signature-using-mapped-types/68261113#68261113
* This is mainly used to remove explicit `any`s from the return type of some memoizers. e.g: `microMemoize`
*/
export type OmitIndexSignature<ObjectType> = {
[KeyType in keyof ObjectType as {} extends Record<KeyType, unknown>
? never
: KeyType]: ObjectType[KeyType]
}

/** Extracts memoize options from the parameters of a memoizer function. */
export type MemoizeOptsFromParams<MemoizeFunction extends UnknownMemoizer> =
| DropFirst<Parameters<MemoizeFunction>>[0]
| DropFirst<Parameters<MemoizeFunction>>

/** Extract the extra properties that are attached to the return value of a memoizer. e.g.: clearCache */
export type ExtractMemoizerFields<T extends UnknownMemoizer> =
OmitIndexSignature<ReturnType<T>>

/** Extract the return type from all functions as a tuple */
export type ExtractReturnType<T extends readonly AnyFunction[]> = {
[index in keyof T]: T[index] extends T[number] ? ReturnType<T[index]> : never
Expand Down
112 changes: 56 additions & 56 deletions test/reselect.bench.ts
Original file line number Diff line number Diff line change
@@ -1,56 +1,56 @@
import { createSelector } from '@reduxjs/toolkit'
import { bench } from 'vitest'
import { autotrackMemoize } from '../src/autotrackMemoize/autotrackMemoize'
import { weakMapMemoize } from '../src/weakMapMemoize'

describe('bench', () => {
interface State {
todos: {
id: number
completed: boolean
}[]
}
const state: State = {
todos: [
{ id: 0, completed: false },
{ id: 1, completed: false }
]
}
bench(
'selectorDefault',
() => {
const selectorDefault = createSelector(
(state: State) => state.todos,
todos => todos.map(t => t.id)
)
selectorDefault(state)
},
{ iterations: 500 }
)

bench(
'selectorAutotrack',
() => {
const selectorAutotrack = createSelector(
(state: State) => state.todos,
todos => todos.map(t => t.id),
{ memoize: autotrackMemoize }
)
selectorAutotrack(state)
},
{ iterations: 500 }
)

bench(
'selectorWeakMap',
() => {
const selectorWeakMap = createSelector(
(state: State) => state.todos,
todos => todos.map(t => t.id),
{ memoize: weakMapMemoize }
)
selectorWeakMap(state)
},
{ iterations: 500 }
)
})
import { createSelector } from '@reduxjs/toolkit'
import { bench } from 'vitest'
import { autotrackMemoize } from '../src/autotrackMemoize/autotrackMemoize'
import { weakMapMemoize } from '../src/weakMapMemoize'

describe('bench', () => {
interface State {
todos: {
id: number
completed: boolean
}[]
}
const state: State = {
todos: [
{ id: 0, completed: false },
{ id: 1, completed: false }
]
}
bench(
'selectorDefault',
() => {
const selectorDefault = createSelector(
(state: State) => state.todos,
todos => todos.map(t => t.id)
)
selectorDefault(state)
},
{ iterations: 500 }
)

bench(
'selectorAutotrack',
() => {
const selectorAutotrack = createSelector(
(state: State) => state.todos,
todos => todos.map(t => t.id),
{ memoize: autotrackMemoize }
)
selectorAutotrack(state)
},
{ iterations: 500 }
)

bench(
'selectorWeakMap',
() => {
const selectorWeakMap = createSelector(
(state: State) => state.todos,
todos => todos.map(t => t.id),
{ memoize: weakMapMemoize }
)
selectorWeakMap(state)
},
{ iterations: 500 }
)
})
Loading

0 comments on commit 8ad544e

Please sign in to comment.