Andrew Scott 4456e7e4de refactor(core): remove looseIdentical in favor of built-in Object.is (#37191)
Remove `looseIdentical` implementation and instead use the ES2015 `Object.is` in its place.
They behave exactly the same way except for `+0`/`-0`.
`looseIdentical(+0, -0)` => `true`
`Object.is(+0, -0)` => `false`

Other than the difference noted above, this is not be a breaking change because:
1. `looseIdentical` is a private API
2. ES2015 is listed as a mandatory polyfill in the [browser support
guide](https://angular.io/guide/browser-support#mandatory-polyfills)
3. Also note that `Ivy` already uses `Object.is` in `bindingUpdated`.

PR Close #37191
2020-06-01 17:19:17 -04:00

104 lines
3.8 KiB
TypeScript

/**
* @license
* Copyright Google LLC All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://angular.io/license
*/
import {IterableChangeRecord, IterableChanges} from '@angular/core/src/change_detection/differs/iterable_differs';
import {KeyValueChangeRecord, KeyValueChanges} from '@angular/core/src/change_detection/differs/keyvalue_differs';
import {stringify} from '../../src/util/stringify';
export function iterableDifferToString<V>(iterableChanges: IterableChanges<V>) {
const collection: string[] = [];
iterableChanges.forEachItem(
(record: IterableChangeRecord<V>) => collection.push(icrAsString(record)));
const previous: string[] = [];
iterableChanges.forEachPreviousItem(
(record: IterableChangeRecord<V>) => previous.push(icrAsString(record)));
const additions: string[] = [];
iterableChanges.forEachAddedItem(
(record: IterableChangeRecord<V>) => additions.push(icrAsString(record)));
const moves: string[] = [];
iterableChanges.forEachMovedItem(
(record: IterableChangeRecord<V>) => moves.push(icrAsString(record)));
const removals: string[] = [];
iterableChanges.forEachRemovedItem(
(record: IterableChangeRecord<V>) => removals.push(icrAsString(record)));
const identityChanges: string[] = [];
iterableChanges.forEachIdentityChange(
(record: IterableChangeRecord<V>) => identityChanges.push(icrAsString(record)));
return iterableChangesAsString(
{collection, previous, additions, moves, removals, identityChanges});
}
function icrAsString<V>(icr: IterableChangeRecord<V>): string {
return icr.previousIndex === icr.currentIndex ? stringify(icr.item) :
stringify(icr.item) + '[' +
stringify(icr.previousIndex) + '->' + stringify(icr.currentIndex) + ']';
}
export function iterableChangesAsString({
collection = [] as any,
previous = [] as any,
additions = [] as any,
moves = [] as any,
removals = [] as any,
identityChanges = [] as any
}): string {
return 'collection: ' + collection.join(', ') + '\n' +
'previous: ' + previous.join(', ') + '\n' +
'additions: ' + additions.join(', ') + '\n' +
'moves: ' + moves.join(', ') + '\n' +
'removals: ' + removals.join(', ') + '\n' +
'identityChanges: ' + identityChanges.join(', ') + '\n';
}
function kvcrAsString(kvcr: KeyValueChangeRecord<string, any>) {
return Object.is(kvcr.previousValue, kvcr.currentValue) ?
stringify(kvcr.key) :
(stringify(kvcr.key) + '[' + stringify(kvcr.previousValue) + '->' +
stringify(kvcr.currentValue) + ']');
}
export function kvChangesAsString(kvChanges: KeyValueChanges<string, any>) {
const map: string[] = [];
const previous: string[] = [];
const changes: string[] = [];
const additions: string[] = [];
const removals: string[] = [];
kvChanges.forEachItem(r => map.push(kvcrAsString(r)));
kvChanges.forEachPreviousItem(r => previous.push(kvcrAsString(r)));
kvChanges.forEachChangedItem(r => changes.push(kvcrAsString(r)));
kvChanges.forEachAddedItem(r => additions.push(kvcrAsString(r)));
kvChanges.forEachRemovedItem(r => removals.push(kvcrAsString(r)));
return testChangesAsString({map, previous, additions, changes, removals});
}
export function testChangesAsString(
{map, previous, additions, changes, removals}:
{map?: any[], previous?: any[], additions?: any[], changes?: any[], removals?: any[]}):
string {
if (!map) map = [];
if (!previous) previous = [];
if (!additions) additions = [];
if (!changes) changes = [];
if (!removals) removals = [];
return 'map: ' + map.join(', ') + '\n' +
'previous: ' + previous.join(', ') + '\n' +
'additions: ' + additions.join(', ') + '\n' +
'changes: ' + changes.join(', ') + '\n' +
'removals: ' + removals.join(', ') + '\n';
}