diff --git a/src/app/store/observers/actionObserver.ts b/src/app/store/observers/actionObserver.ts index 54b90cd8..a66b0d89 100644 --- a/src/app/store/observers/actionObserver.ts +++ b/src/app/store/observers/actionObserver.ts @@ -9,7 +9,7 @@ import { import { filter, map, type Observable, Subject } from 'rxjs' import { injectStoreExtension } from '../enhancers/injectStoreExtension' -import { createWeakCache } from './weakCache' +import { weakMemo } from './weakMemo' type ObserveAction = (actionCreator: PayloadActionCreator) => Observable @@ -36,11 +36,9 @@ export const createActionObserver = (): ActionObserver => { return result } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const cache = createWeakCache>() - - const onAction: ObserveAction = (actionCreator) => - cache(actionCreator, () => action$.pipe(filter(matchType(actionCreator)), map(getPayload))) + const onAction: ObserveAction = weakMemo((actionCreator) => + action$.pipe(filter(matchType(actionCreator)), map(getPayload)), + ) const enhancer = injectStoreExtension(() => ({ onAction })) diff --git a/src/app/store/observers/stateObserver.ts b/src/app/store/observers/stateObserver.ts index 7fdf7275..c083721f 100644 --- a/src/app/store/observers/stateObserver.ts +++ b/src/app/store/observers/stateObserver.ts @@ -4,7 +4,7 @@ import { BehaviorSubject, distinctUntilChanged, map, type Observable } from 'rxj import { invariant } from '@/common/utils' import { injectStoreExtension } from '../enhancers/injectStoreExtension' -import { createWeakCache } from './weakCache' +import { weakMemo } from './weakMemo' type ObserveState = (selector: Selector) => Observable @@ -32,10 +32,9 @@ export const createStateObserver = (): StateObserver => { } } - const cache = createWeakCache>() - - const onState: ObserveState = (selector) => - cache(selector, () => distinctState$.pipe(map(selector), distinctUntilChanged())) + const onState: ObserveState = weakMemo((selector) => + distinctState$.pipe(map(selector), distinctUntilChanged()), + ) const enhancer = injectStoreExtension(() => ({ onState })) diff --git a/src/app/store/observers/weakCache.ts b/src/app/store/observers/weakCache.ts deleted file mode 100644 index 1b34aaea..00000000 --- a/src/app/store/observers/weakCache.ts +++ /dev/null @@ -1,15 +0,0 @@ -type WeakCache = (key: K, createValue: () => V) => V - -export const createWeakCache = (): WeakCache => { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const values = new WeakMap() - - return (key, createValue) => { - let value = values.get(key) - if (!value) { - value = createValue() - values.set(key, value) - } - return value - } -} diff --git a/src/app/store/observers/weakMemo.ts b/src/app/store/observers/weakMemo.ts new file mode 100644 index 00000000..8c94b1b2 --- /dev/null +++ b/src/app/store/observers/weakMemo.ts @@ -0,0 +1,9 @@ +export const weakMemo = (fn: (arg: Arg) => Result): typeof fn => { + const cache = new WeakMap() + return (arg) => { + if (!cache.has(arg)) { + cache.set(arg, fn(arg)) + } + return cache.get(arg)! + } +}