@@ -2,9 +2,7 @@ import type { Action, Dispatch, MiddlewareAPI, UnknownAction } from 'redux'
22import { isAction } from 'redux'
33import type { ThunkDispatch } from 'redux-thunk'
44import { createAction } from '../createAction'
5- import { nanoid } from '../nanoid'
65
7- import { find } from '../utils'
86import {
97 TaskAbortError ,
108 listenerCancelled ,
@@ -48,6 +46,7 @@ import {
4846 catchRejection ,
4947 noop ,
5048} from './utils'
49+ import { getOrInsertComputed } from '@internal/utils'
5150export { TaskAbortError } from './exceptions'
5251export 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
249246const 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 ) => {
0 commit comments