import { Subject } from 'rxjs'; import { Change, Changes } from './Change'; export type ChangeDispatcher = Subject>; const changeDispatchers = new WeakMap>(); export const getChangeDispatcher = (obj: O, createIfNotExist = false): ChangeDispatcher | undefined => { // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment let dispatcher: ChangeDispatcher = changeDispatchers.get(obj) as any; if (dispatcher == null && createIfNotExist) { dispatcher = new Subject>(); changeDispatchers.set(obj, dispatcher as any as ChangeDispatcher); } return dispatcher; }; export const dispatchChanges = (obj: O, changes: Changes) => { const dispatcher = getChangeDispatcher(obj); if (dispatcher) { dispatcher.next(changes); } }; export const dispatchChange = (obj: object, key: Key, oldValue: Value, newValue: Value) => { const dispatcher = getChangeDispatcher(obj); if (dispatcher) { dispatcher.next({ [key]: new Change(oldValue, newValue) }); } }; export const hasKeys = (changes: Changes, ...keys: (keyof O)[]) => { return keys.some((key) => Object.prototype.hasOwnProperty.call(changes, key)); };