Skip to content

Commit f8cdab2

Browse files
committed
Fix README for v5.
- Add documentation regarding new features. - Redo `CodeSandbox` examples to align better with documentation. Solves reduxjs#598. - Fix GitHub workflow badge URL reduxjs#628. - Add instructions for `bun` and `pnpm`. Solves reduxjs#621. - Fix minor type issues regarding `createStructuredSelector`. Solves reduxjs#499. - `argsMemoize` and `argsMemoizeOptions` solve reduxjs#359. - Remove `Redux` legacy patterns including `connect` and `switch` statements from docs. Solves reduxjs#515. - Replace legacy code patterns with modern syntax like `useSelector` and functional components. - Implementation of `argsMemoize` solves reduxjs#376. - Document order of execution in `Reselect`. Solves reduxjs#455. - Add benchmarks to confirm the info inside the documentation. - Add more type tests with `vitest`. - Fix more hover preview issues with types.
1 parent e4fe262 commit f8cdab2

35 files changed

+5027
-1013
lines changed

README.md

Lines changed: 1676 additions & 513 deletions
Large diffs are not rendered by default.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<mxfile host="65bd71144e" scale="1" border="0">
2+
<diagram id="s5zgOlhoY8HzJwKQ5w-s" name="Page-1">
3+
<mxGraphModel dx="1244" dy="636" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="2000" pageHeight="2000" background="#C7FFFB" math="0" shadow="1">
4+
<root>
5+
<mxCell id="0"/>
6+
<mxCell id="1" parent="0"/>
7+
<mxCell id="7" value="" style="group;aspect=fixed;shadow=1;" vertex="1" connectable="0" parent="1">
8+
<mxGeometry x="60" y="460" width="681.5" height="290" as="geometry"/>
9+
</mxCell>
10+
<mxCell id="2" value="Are arguments same as last time?" style="whiteSpace=wrap;html=1;rounded=1;shadow=1;aspect=fixed;" parent="7" vertex="1">
11+
<mxGeometry x="250" y="20" width="150" height="80" as="geometry"/>
12+
</mxCell>
13+
<mxCell id="3" value="Return result." style="whiteSpace=wrap;html=1;rounded=1;shadow=1;" parent="7" vertex="1">
14+
<mxGeometry x="460" y="180" width="110" height="60" as="geometry"/>
15+
</mxCell>
16+
<object label="Yes" id="4">
17+
<mxCell style="edgeStyle=none;html=1;entryX=0;entryY=0;entryDx=0;entryDy=0;shadow=1;" parent="7" source="2" target="3" edge="1">
18+
<mxGeometry relative="1" as="geometry"/>
19+
</mxCell>
20+
</object>
21+
<mxCell id="5" value="Run function again." style="whiteSpace=wrap;html=1;rounded=1;shadow=1;" parent="7" vertex="1">
22+
<mxGeometry x="30" y="180" width="150" height="60" as="geometry"/>
23+
</mxCell>
24+
<mxCell id="6" value="No" style="edgeStyle=none;html=1;entryX=1;entryY=0;entryDx=0;entryDy=0;shadow=1;" parent="7" source="2" target="5" edge="1">
25+
<mxGeometry relative="1" as="geometry"/>
26+
</mxCell>
27+
<mxCell id="8" value="Untitled Layer" parent="0"/>
28+
</root>
29+
</mxGraphModel>
30+
</diagram>
31+
</mxfile>
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<mxfile host="65bd71144e">
2+
<diagram id="hFjyuBP9kS8yiWHOacYP" name="Page-1">
3+
<mxGraphModel dx="792" dy="1668" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="850" pageHeight="1100" background="#C7FFFB" math="0" shadow="0">
4+
<root>
5+
<mxCell id="0"/>
6+
<mxCell id="1" parent="0"/>
7+
<mxCell id="15" value="" style="group" vertex="1" connectable="0" parent="1">
8+
<mxGeometry x="70" y="-110" width="930" height="440" as="geometry"/>
9+
</mxCell>
10+
<mxCell id="2" value="Are arguments same as last time?" style="whiteSpace=wrap;html=1;rounded=1;shadow=1;" parent="15" vertex="1">
11+
<mxGeometry x="470.735" y="35.2" width="139.57750000000001" height="58.036" as="geometry"/>
12+
</mxCell>
13+
<mxCell id="3" value="Return result." style="whiteSpace=wrap;html=1;rounded=1;shadow=1;" parent="15" vertex="1">
14+
<mxGeometry x="680" y="159.2" width="132.19" height="80" as="geometry"/>
15+
</mxCell>
16+
<mxCell id="8" value="Yes" style="edgeStyle=none;html=1;entryX=0;entryY=0;entryDx=0;entryDy=0;shadow=1;" parent="15" source="2" target="3" edge="1">
17+
<mxGeometry relative="1" as="geometry"/>
18+
</mxCell>
19+
<mxCell id="4" value="Run input selectors.&lt;br&gt;Are the results of input selectors same as last time?" style="whiteSpace=wrap;html=1;rounded=1;shadow=1;" parent="15" vertex="1">
20+
<mxGeometry x="251.88" y="158.4" width="168.12" height="81.6" as="geometry"/>
21+
</mxCell>
22+
<mxCell id="9" value="No" style="edgeStyle=none;html=1;entryX=1;entryY=0;entryDx=0;entryDy=0;shadow=1;" parent="15" source="2" target="4" edge="1">
23+
<mxGeometry relative="1" as="geometry"/>
24+
</mxCell>
25+
<mxCell id="6" value="Return result." style="whiteSpace=wrap;html=1;rounded=1;shadow=1;" parent="15" vertex="1">
26+
<mxGeometry x="470.7375" y="310" width="135.625" height="44" as="geometry"/>
27+
</mxCell>
28+
<mxCell id="13" value="Yes" style="edgeStyle=none;html=1;entryX=0;entryY=0;entryDx=0;entryDy=0;shadow=1;" parent="15" source="4" target="6" edge="1">
29+
<mxGeometry relative="1" as="geometry"/>
30+
</mxCell>
31+
<mxCell id="7" value="Run result function." style="whiteSpace=wrap;html=1;rounded=1;shadow=1;" parent="15" vertex="1">
32+
<mxGeometry x="59.9975" y="310" width="135.625" height="44" as="geometry"/>
33+
</mxCell>
34+
<mxCell id="14" value="No" style="edgeStyle=none;html=1;entryX=1;entryY=0;entryDx=0;entryDy=0;shadow=1;" parent="15" source="4" target="7" edge="1">
35+
<mxGeometry relative="1" as="geometry"/>
36+
</mxCell>
37+
</root>
38+
</mxGraphModel>
39+
</diagram>
40+
</mxfile>
17.4 KB
Loading
34.3 KB
Loading

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,10 @@
2727
"format": "prettier --write \"{src,test}/**/*.{js,ts}\" \"docs/**/*.md\"",
2828
"lint": "eslint src test",
2929
"prepack": "yarn build",
30-
"bench": "vitest --run bench",
30+
"bench": "vitest --run bench --mode production",
3131
"test": "node --expose-gc ./node_modules/vitest/dist/cli-wrapper.js run",
3232
"test:cov": "vitest run --coverage",
33+
"type-check": "vitest --run typecheck",
3334
"test:typescript": "tsc --noEmit -p typescript_test/tsconfig.json"
3435
},
3536
"keywords": [

src/autotrackMemoize/autotrackMemoize.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,11 @@ import {
55
createCacheKeyComparator,
66
defaultEqualityCheck
77
} from '@internal/defaultMemoize'
8-
import type { AnyFunction } from '@internal/types'
8+
import type {
9+
AnyFunction,
10+
DefaultMemoizeFields,
11+
Simplify
12+
} from '@internal/types'
913
import { createCache } from './autotracking'
1014

1115
/**
@@ -55,7 +59,7 @@ import { createCache } from './autotracking'
5559
* ```ts
5660
* import { unstable_autotrackMemoize as autotrackMemoize, createSelectorCreator } from 'reselect'
5761
*
58-
* const createSelectorAutotrack = createSelectorCreator(autotrackMemoize)
62+
* const createSelectorAutotrack = createSelectorCreator({ memoize: autotrackMemoize })
5963
*
6064
* const selectTodoIds = createSelectorAutotrack(
6165
* [(state: RootState) => state.todos],
@@ -93,7 +97,9 @@ export function autotrackMemoize<Func extends AnyFunction>(func: Func) {
9397
return cache.value
9498
}
9599

96-
memoized.clearCache = () => cache.clear()
100+
memoized.clearCache = () => {
101+
return cache.clear()
102+
}
97103

98-
return memoized as Func & { clearCache: () => void }
104+
return memoized as Func & Simplify<DefaultMemoizeFields>
99105
}
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
import type { CreateSelectorFunction } from './createSelectorCreator'
2+
import { createSelectorCreator } from './createSelectorCreator'
3+
4+
import { defaultMemoize } from './defaultMemoize'
5+
import type {
6+
Combiner,
7+
CreateSelectorOptions,
8+
CurriedOutputSelector,
9+
DropFirstParameter,
10+
InterruptRecursion,
11+
SelectorArray,
12+
Simplify,
13+
UnknownMemoizer
14+
} from './types'
15+
16+
/**
17+
* @WIP
18+
*/
19+
export interface CreateCurriedSelector<
20+
MemoizeFunction extends UnknownMemoizer = typeof defaultMemoize,
21+
ArgsMemoizeFunction extends UnknownMemoizer = typeof defaultMemoize
22+
> {
23+
/**
24+
* One arg
25+
*/
26+
<InputSelectors extends SelectorArray, Result>(
27+
...createSelectorArgs: [
28+
...inputSelectors: InputSelectors,
29+
combiner: Combiner<InputSelectors, Result>
30+
]
31+
): CurriedOutputSelector<
32+
InputSelectors,
33+
Result,
34+
MemoizeFunction,
35+
ArgsMemoizeFunction
36+
> &
37+
InterruptRecursion
38+
39+
/**
40+
* inline args
41+
*/
42+
<
43+
InputSelectors extends SelectorArray,
44+
Result,
45+
OverrideMemoizeFunction extends UnknownMemoizer = MemoizeFunction,
46+
OverrideArgsMemoizeFunction extends UnknownMemoizer = ArgsMemoizeFunction
47+
>(
48+
...createSelectorArgs: [
49+
...inputSelectors: InputSelectors,
50+
combiner: Combiner<InputSelectors, Result>,
51+
createSelectorOptions: Simplify<
52+
CreateSelectorOptions<
53+
MemoizeFunction,
54+
ArgsMemoizeFunction,
55+
OverrideMemoizeFunction,
56+
OverrideArgsMemoizeFunction
57+
>
58+
>
59+
]
60+
): CurriedOutputSelector<
61+
InputSelectors,
62+
Result,
63+
OverrideMemoizeFunction,
64+
OverrideArgsMemoizeFunction
65+
> &
66+
InterruptRecursion
67+
68+
/**
69+
* array args
70+
*/
71+
<
72+
InputSelectors extends SelectorArray,
73+
Result,
74+
OverrideMemoizeFunction extends UnknownMemoizer = MemoizeFunction,
75+
OverrideArgsMemoizeFunction extends UnknownMemoizer = ArgsMemoizeFunction
76+
>(
77+
inputSelectors: [...InputSelectors],
78+
combiner: Combiner<InputSelectors, Result>,
79+
createSelectorOptions?: Simplify<
80+
CreateSelectorOptions<
81+
MemoizeFunction,
82+
ArgsMemoizeFunction,
83+
OverrideMemoizeFunction,
84+
OverrideArgsMemoizeFunction
85+
>
86+
>
87+
): CurriedOutputSelector<
88+
InputSelectors,
89+
Result,
90+
OverrideMemoizeFunction,
91+
OverrideArgsMemoizeFunction
92+
> &
93+
InterruptRecursion
94+
}
95+
96+
/**
97+
* @WIP
98+
*/
99+
export function createCurriedSelectorCreator<
100+
MemoizeFunction extends UnknownMemoizer = typeof defaultMemoize,
101+
ArgsMemoizeFunction extends UnknownMemoizer = typeof defaultMemoize
102+
>(...createSelectorCreatorArgs: Parameters<typeof createSelectorCreator>) {
103+
const createSelector = createSelectorCreator(...createSelectorCreatorArgs)
104+
105+
const createCurriedSelector = (
106+
...createSelectorArgs: Parameters<
107+
CreateSelectorFunction<MemoizeFunction, ArgsMemoizeFunction>
108+
>
109+
) => {
110+
// @ts-ignore
111+
const selector = createSelector.apply(null, createSelectorArgs)
112+
// const selector = createSelector(...createSelectorArgs)
113+
const curriedSelector = selector.argsMemoize(
114+
(...params: DropFirstParameter<typeof selector>) => {
115+
return selector.argsMemoize((state: Parameters<typeof selector>[0]) => {
116+
return selector(state, ...params)
117+
})
118+
}
119+
)
120+
return Object.assign(curriedSelector, selector) as CurriedOutputSelector
121+
}
122+
return createCurriedSelector as unknown as CreateCurriedSelector<
123+
MemoizeFunction,
124+
ArgsMemoizeFunction
125+
>
126+
}
127+
128+
/**
129+
* @WIP
130+
*/
131+
export const createCurriedSelector =
132+
/* #__PURE__ */ createCurriedSelectorCreator(defaultMemoize)

0 commit comments

Comments
 (0)