array/intersect.ts

/** @module Array */

import { isArr } from './isArr'

/**
 * Creates and returns a new array of all items that exist in both passed in arrays
 * @param {Array<any>} arrA - array to compare with arrB
 * @param {Array<any>} arrB - array to compare with arrA
 *
 * @example
 *  intersect([1], [1]) === [1]
 *
 * @returns {Array<any>} - Array of matching items
 */
export const intersect = <T = any, M = any[], N = any[]>(
  arrA: M,
  arrB: N
): T[] => {
  if (!isArr(arrA) || !isArr(arrB)) return []

  const setB = new Set(arrB as any[])
  return [...new Set(arrA as any[])].filter(x => setB.has(x)) as T[]
}