import { curry } from '@typed/lambda'
import { includes } from '../includes'
/**
* Remove duplicate values from a list given a comparison function.
* @param comparison :: (a -> int -> b)
* @param list :: [a]
* @returns :: [a]
*/
export const uniqBy = curry(
(toComparisonValue: (value: A, index: number) => B, list: ReadonlyArray): A[] => {
const valuesSeen: B[] = []
const result: A[] = []
// tslint:disable-next-line:prefer-for-of
for (let i = 0; i < list.length; ++i) {
const value = list[i]
const comparisonValue = toComparisonValue(value, i)
const valueHasBeenSeen = includes(comparisonValue, valuesSeen)
if (!valueHasBeenSeen) {
valuesSeen.push(comparisonValue)
result.push(value)
}
}
return result
},
) as {
(toComparisonValue: (value: A, index: number) => B, list: ReadonlyArray): A[]
(toComparisonValue: (value: A, index: number) => B): (list: ReadonlyArray) => A[]
}