import { curryN } from "@unboxing/function"; type KeyFunc = (a: T) => string; interface UniqBy { (fn: KeyFunc, list: ArrayLike): T[]; (fn: KeyFunc): (list: ArrayLike) => T[]; } /** * Returns unique items in array. Uniqueness is defined by `fn`. */ export const uniqueBy = curryN(2, (fn: KeyFunc, arr: ArrayLike = []) => { const result = []; const unq = Object.create(null); for (let i = 0; i < arr.length; i++) { const key = fn(arr[i]); if (!unq[key]) { result.push(arr[i]); unq[key] = true; } } return result; }) as UniqBy