-
-
Notifications
You must be signed in to change notification settings - Fork 6
/
removeDuplicates.ts
30 lines (25 loc) 路 912 Bytes
/
removeDuplicates.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import { allEqualsTo } from "./allEqualsTo.ts";
import { ReduceArguments, toReduceArguments } from "./reduceify.ts";
export function arrRemoveDuplicates<ArrOf>(
arr: readonly ArrOf[],
areEquals: (e1: ArrOf, e2: ArrOf) => boolean = (e1, e2) => e1 === e2
): ArrOf[] {
return arr.reduce<ArrOf[]>(
(prev, curr) => [
...prev,
...prev
.map(e => areEquals(curr, e))
.reduce(...allEqualsTo(false)) ?
[curr] : []
],
[]
);
}
export function removeDuplicates<ArrOf>(
areEquals?: (e1: ArrOf, e2: ArrOf) => boolean
): ReduceArguments<ArrOf, ArrOf[]> {
return toReduceArguments(arrRemoveDuplicates, areEquals);
}
export function removeDuplicatesFactory({ areEquals }: { areEquals: <T>(e1: T, e2: T) => boolean; }) {
return { "removeDuplicates": <ArrOf>() => removeDuplicates<ArrOf>(areEquals) };
}