import { useState, useLayoutEffect } from 'react'

import { isEqual } from 'lodash'

/**
 * Given a value and a function to determine equality, return a
 * referentially equal value if the equality function returns true.
 * This hook is helpful in avoiding re-renders and effects running
 * based on an object or value that always changes references but
 * infrequently changes it's value. By default, uses isEqual from
 * lodash. This is typically only useful with objects and arrays.
 *
 * @param {T}                 value      - any value to check equality of
 * @param {(T, T) => boolean} equalityFn - A function to determine equality
 * @returns {T}
 */
export function useEqualityCheck (value, equalityFn = isEqual) {
  const [computedValue, setComputedValue] = useState(value)

  useLayoutEffect(() => {
    if (!equalityFn(value, computedValue)) {
      setComputedValue(value)
    }
  }, [value, equalityFn, computedValue])

  return computedValue
}