Skip to content

Commit

Permalink
[Refactor] don't attempt to run iterable comparisons when there's no …
Browse files Browse the repository at this point in the history
…Symbol.iterator.
  • Loading branch information
ljharb committed Dec 10, 2015
1 parent 078e64a commit 8e34291
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 19 deletions.
1 change: 1 addition & 0 deletions .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
"complexity": [1, 10],
"eqeqeq": [2, "allow-null"],
"id-length": [2, { "min": 1, "max": 23 }],
"max-depth": [2, 5],
"max-statements": [1, 10],
"no-extra-parens": [1],
"no-implicit-coercion": [2, {
Expand Down
40 changes: 21 additions & 19 deletions index.js
Original file line number Diff line number Diff line change
Expand Up @@ -138,25 +138,27 @@ module.exports = function isEqual(value, other) {
if (value.isPrototypeOf(other) || other.isPrototypeOf(value)) { return false; }
if (getPrototypeOf(value) !== getPrototypeOf(other)) { return false; }

var valueIteratorFn = value[symbolIterator];
var valueIsIterable = isCallable(valueIteratorFn);
var otherIteratorFn = other[symbolIterator];
var otherIsIterable = isCallable(otherIteratorFn);
if (valueIsIterable !== otherIsIterable) {
return false;
}
if (valueIsIterable && otherIsIterable) {
var valueIterator = valueIteratorFn.call(value);
var otherIterator = otherIteratorFn.call(other);
var valueNext, otherNext;
do {
valueNext = valueIterator.next();
otherNext = otherIterator.next();
if (!valueNext.done && !otherNext.done && !isEqual(valueNext, otherNext)) {
return false;
}
} while (!valueNext.done && !otherNext.done);
return valueNext.done === otherNext.done;
if (symbolIterator) {
var valueIteratorFn = value[symbolIterator];
var valueIsIterable = isCallable(valueIteratorFn);
var otherIteratorFn = other[symbolIterator];
var otherIsIterable = isCallable(otherIteratorFn);
if (valueIsIterable !== otherIsIterable) {
return false;
}
if (valueIsIterable && otherIsIterable) {
var valueIterator = valueIteratorFn.call(value);
var otherIterator = otherIteratorFn.call(other);
var valueNext, otherNext;
do {
valueNext = valueIterator.next();
otherNext = otherIterator.next();
if (!valueNext.done && !otherNext.done && !isEqual(valueNext, otherNext)) {
return false;
}
} while (!valueNext.done && !otherNext.done);
return valueNext.done === otherNext.done;
}
}

return isEqual(entries(value), entries(other));
Expand Down

0 comments on commit 8e34291

Please sign in to comment.