import { useEffect, useRef } from 'react'; export type RefHook = { current: T; }; export const useComparatorRef = ( value: T | null | undefined, isEqual: (v1: T | null | undefined, v2: T | null | undefined) => boolean, onChange?: () => void ): RefHook => { const ref = useRef(value); useEffect(() => { if (!isEqual(value, ref.current)) { ref.current = value; if (onChange) { onChange(); } } }); return ref; }; export interface HasIsEqual { isEqual: (value: T) => boolean; } const isEqual = >( v1: T | null | undefined, v2: T | null | undefined ): boolean => { const bothNull: boolean = !v1 && !v2; const equal: boolean = !!v1 && !!v2 && v1.isEqual(v2); return bothNull || equal; }; export const useIsEqualRef = >( value: T | null | undefined, onChange?: () => void ): RefHook => { return useComparatorRef(value, isEqual, onChange); };