Skip to content

Commit 3bb8486

Browse files
committed
Simplify listener/dynamic middleware code
1 parent 2ad4bb4 commit 3bb8486

File tree

5 files changed

+42
-51
lines changed

5 files changed

+42
-51
lines changed

packages/toolkit/src/dynamicMiddleware/index.ts

+6-11
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { compose } from 'redux'
33
import { createAction } from '../createAction'
44
import { isAllOf } from '../matchers'
55
import { nanoid } from '../nanoid'
6-
import { find, getOrInsertComputed } from '../utils'
6+
import { getOrInsertComputed } from '../utils'
77
import type {
88
AddMiddleware,
99
DynamicMiddleware,
@@ -23,7 +23,6 @@ const createMiddlewareEntry = <
2323
>(
2424
middleware: Middleware<any, State, DispatchType>,
2525
): MiddlewareEntry<State, DispatchType> => ({
26-
id: nanoid(),
2726
middleware,
2827
applied: new Map(),
2928
})
@@ -38,7 +37,10 @@ export const createDynamicMiddleware = <
3837
DispatchType extends Dispatch<UnknownAction> = Dispatch<UnknownAction>,
3938
>(): DynamicMiddlewareInstance<State, DispatchType> => {
4039
const instanceId = nanoid()
41-
const middlewareMap = new Map<string, MiddlewareEntry<State, DispatchType>>()
40+
const middlewareMap = new Map<
41+
Middleware<any, State, DispatchType>,
42+
MiddlewareEntry<State, DispatchType>
43+
>()
4244

4345
const withMiddleware = Object.assign(
4446
createAction(
@@ -58,14 +60,7 @@ export const createDynamicMiddleware = <
5860
...middlewares: Middleware<any, State, DispatchType>[]
5961
) {
6062
middlewares.forEach((middleware) => {
61-
let entry = find(
62-
Array.from(middlewareMap.values()),
63-
(entry) => entry.middleware === middleware,
64-
)
65-
if (!entry) {
66-
entry = createMiddlewareEntry(middleware)
67-
}
68-
middlewareMap.set(entry.id, entry)
63+
getOrInsertComputed(middlewareMap, middleware, createMiddlewareEntry)
6964
})
7065
},
7166
{ withTypes: () => addMiddleware },

packages/toolkit/src/dynamicMiddleware/types.ts

-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,6 @@ export type MiddlewareEntry<
5959
State = unknown,
6060
DispatchType extends Dispatch<UnknownAction> = Dispatch<UnknownAction>,
6161
> = {
62-
id: string
6362
middleware: Middleware<any, State, DispatchType>
6463
applied: Map<
6564
MiddlewareAPI<DispatchType, State>,

packages/toolkit/src/listenerMiddleware/index.ts

+9-18
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ import type { Action, Dispatch, MiddlewareAPI, UnknownAction } from 'redux'
22
import { isAction } from 'redux'
33
import type { ThunkDispatch } from 'redux-thunk'
44
import { createAction } from '../createAction'
5-
import { nanoid } from '../nanoid'
65

7-
import { find } from '../utils'
86
import {
97
TaskAbortError,
108
listenerCancelled,
@@ -48,6 +46,7 @@ import {
4846
catchRejection,
4947
noop,
5048
} from './utils'
49+
import { getOrInsertComputed } from '@internal/utils'
5150
export { TaskAbortError } from './exceptions'
5251
export type {
5352
AsyncTaskExecutor,
@@ -221,9 +220,7 @@ export const createListenerEntry: TypedCreateListenerEntry<unknown> =
221220
(options: FallbackAddListenerOptions) => {
222221
const { type, predicate, effect } = getListenerEntryPropsFrom(options)
223222

224-
const id = nanoid()
225223
const entry: ListenerEntry<unknown> = {
226-
id,
227224
effect,
228225
type,
229226
predicate,
@@ -247,7 +244,7 @@ const cancelActiveListeners = (
247244
}
248245

249246
const createClearListenerMiddleware = (
250-
listenerMap: Map<string, ListenerEntry>,
247+
listenerMap: Map<ListenerEntry['effect'], ListenerEntry>,
251248
) => {
252249
return () => {
253250
listenerMap.forEach(cancelActiveListeners)
@@ -324,15 +321,15 @@ export const createListenerMiddleware = <
324321
>(
325322
middlewareOptions: CreateListenerMiddlewareOptions<ExtraArgument> = {},
326323
) => {
327-
const listenerMap = new Map<string, ListenerEntry>()
324+
const listenerMap = new Map<ListenerEntry['effect'], ListenerEntry>()
328325
const { extra, onError = defaultErrorHandler } = middlewareOptions
329326

330327
assertFunction(onError, 'onError')
331328

332329
const insertEntry = (entry: ListenerEntry) => {
333-
entry.unsubscribe = () => listenerMap.delete(entry!.id)
330+
entry.unsubscribe = () => listenerMap.delete(entry.effect)
334331

335-
listenerMap.set(entry.id, entry)
332+
listenerMap.set(entry.effect, entry)
336333
return (cancelOptions?: UnsubscribeListenerOptions) => {
337334
entry.unsubscribe()
338335
if (cancelOptions?.cancelActive) {
@@ -342,15 +339,9 @@ export const createListenerMiddleware = <
342339
}
343340

344341
const startListening = ((options: FallbackAddListenerOptions) => {
345-
let entry = find(
346-
Array.from(listenerMap.values()),
347-
(existingEntry) => existingEntry.effect === options.effect,
342+
const entry = getOrInsertComputed(listenerMap, options.effect, () =>
343+
createListenerEntry(options as any),
348344
)
349-
350-
if (!entry) {
351-
entry = createListenerEntry(options as any)
352-
}
353-
354345
return insertEntry(entry)
355346
}) as AddListenerOverloads<any>
356347

@@ -363,7 +354,7 @@ export const createListenerMiddleware = <
363354
): boolean => {
364355
const { type, effect, predicate } = getListenerEntryPropsFrom(options)
365356

366-
const entry = find(Array.from(listenerMap.values()), (entry) => {
357+
const entry = Array.from(listenerMap.values()).find((entry) => {
367358
const matchPredicateOrType =
368359
typeof type === 'string'
369360
? entry.type === type
@@ -419,7 +410,7 @@ export const createListenerMiddleware = <
419410
fork: createFork(internalTaskController.signal, autoJoinPromises),
420411
unsubscribe: entry.unsubscribe,
421412
subscribe: () => {
422-
listenerMap.set(entry.id, entry)
413+
listenerMap.set(entry.effect, entry)
423414
},
424415
cancelActiveListeners: () => {
425416
entry.pending.forEach((controller, _, set) => {

packages/toolkit/src/listenerMiddleware/types.ts

+27-8
Original file line numberDiff line numberDiff line change
@@ -578,9 +578,13 @@ export type TypedAddListener<
578578
OverrideStateType,
579579
unknown,
580580
UnknownAction
581-
>,
582-
OverrideExtraArgument = unknown,
583-
>() => TypedAddListener<OverrideStateType, OverrideDispatchType, OverrideExtraArgument>
581+
>,
582+
OverrideExtraArgument = unknown,
583+
>() => TypedAddListener<
584+
OverrideStateType,
585+
OverrideDispatchType,
586+
OverrideExtraArgument
587+
>
584588
}
585589

586590
/**
@@ -641,7 +645,11 @@ export type TypedRemoveListener<
641645
UnknownAction
642646
>,
643647
OverrideExtraArgument = unknown,
644-
>() => TypedRemoveListener<OverrideStateType, OverrideDispatchType, OverrideExtraArgument>
648+
>() => TypedRemoveListener<
649+
OverrideStateType,
650+
OverrideDispatchType,
651+
OverrideExtraArgument
652+
>
645653
}
646654

647655
/**
@@ -701,7 +709,11 @@ export type TypedStartListening<
701709
UnknownAction
702710
>,
703711
OverrideExtraArgument = unknown,
704-
>() => TypedStartListening<OverrideStateType, OverrideDispatchType, OverrideExtraArgument>
712+
>() => TypedStartListening<
713+
OverrideStateType,
714+
OverrideDispatchType,
715+
OverrideExtraArgument
716+
>
705717
}
706718

707719
/**
@@ -756,7 +768,11 @@ export type TypedStopListening<
756768
UnknownAction
757769
>,
758770
OverrideExtraArgument = unknown,
759-
>() => TypedStopListening<OverrideStateType, OverrideDispatchType, OverrideExtraArgument>
771+
>() => TypedStopListening<
772+
OverrideStateType,
773+
OverrideDispatchType,
774+
OverrideExtraArgument
775+
>
760776
}
761777

762778
/**
@@ -813,7 +829,11 @@ export type TypedCreateListenerEntry<
813829
UnknownAction
814830
>,
815831
OverrideExtraArgument = unknown,
816-
>() => TypedStopListening<OverrideStateType, OverrideDispatchType, OverrideExtraArgument>
832+
>() => TypedStopListening<
833+
OverrideStateType,
834+
OverrideDispatchType,
835+
OverrideExtraArgument
836+
>
817837
}
818838

819839
/**
@@ -825,7 +845,6 @@ export type ListenerEntry<
825845
State = unknown,
826846
DispatchType extends Dispatch = Dispatch,
827847
> = {
828-
id: string
829848
effect: ListenerEffect<any, State, DispatchType>
830849
unsubscribe: () => void
831850
pending: Set<AbortController>

packages/toolkit/src/utils.ts

-13
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,6 @@ export function delay(ms: number) {
2626
return new Promise((resolve) => setTimeout(resolve, ms))
2727
}
2828

29-
export function find<T>(
30-
iterable: Iterable<T>,
31-
comparator: (item: T) => boolean,
32-
): T | undefined {
33-
for (const entry of iterable) {
34-
if (comparator(entry)) {
35-
return entry
36-
}
37-
}
38-
39-
return undefined
40-
}
41-
4229
export class Tuple<Items extends ReadonlyArray<unknown> = []> extends Array<
4330
Items[number]
4431
> {

0 commit comments

Comments
 (0)