1 | import { deepEqual } from "../internal"
|
2 |
|
3 | export interface IEqualsComparer<T> {
|
4 | (a: T, b: T): boolean
|
5 | }
|
6 |
|
7 | function identityComparer(a: any, b: any): boolean {
|
8 | return a === b
|
9 | }
|
10 |
|
11 | function structuralComparer(a: any, b: any): boolean {
|
12 | return deepEqual(a, b)
|
13 | }
|
14 |
|
15 | function shallowComparer(a: any, b: any): boolean {
|
16 | return deepEqual(a, b, 1)
|
17 | }
|
18 |
|
19 | function defaultComparer(a: any, b: any): boolean {
|
20 | if (Object.is) return Object.is(a, b)
|
21 |
|
22 | return a === b
|
23 | ? a !== 0 || 1 / a === 1 / b
|
24 | : a !== a && b !== b
|
25 | }
|
26 |
|
27 | export const comparer = {
|
28 | identity: identityComparer,
|
29 | structural: structuralComparer,
|
30 | default: defaultComparer,
|
31 | shallow: shallowComparer
|
32 | }
|