equalsIterable.js.flow 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /**
  2. * Copyright (c) 2013-present, Facebook, Inc.
  3. *
  4. * This source code is licensed under the MIT license found in the
  5. * LICENSE file in the root directory of this source tree.
  6. *
  7. * @providesModule equalsIterable
  8. * @flow
  9. */
  10. 'use strict';
  11. const enumerate = require('./enumerate');
  12. /**
  13. * Checks if two iterables are equal. A custom areEqual function may be provided
  14. * as an optional third argument.
  15. */
  16. function equalsIterable<T>(one: Iterable<T>, two: Iterable<T>, areEqual?: ?(one: T, two: T) => boolean): boolean {
  17. if (one === two) {
  18. return true;
  19. }
  20. // We might be able to short circuit by using the size or length fields.
  21. var oneSize = maybeGetSize(one);
  22. var twoSize = maybeGetSize(two);
  23. if (oneSize != null && twoSize != null && oneSize !== twoSize) {
  24. return false;
  25. }
  26. // Otherwise use the iterators to check equality. Here we cannot use for-of
  27. // because we need to advance the iterators at the same time.
  28. var oneIterator = enumerate(one);
  29. var oneItem = oneIterator.next();
  30. var twoIterator = enumerate(two);
  31. var twoItem = twoIterator.next();
  32. var safeAreEqual = areEqual || referenceEquality;
  33. while (!(oneItem.done || twoItem.done)) {
  34. if (!safeAreEqual(oneItem.value, twoItem.value)) {
  35. return false;
  36. }
  37. oneItem = oneIterator.next();
  38. twoItem = twoIterator.next();
  39. }
  40. return oneItem.done === twoItem.done;
  41. }
  42. function maybeGetSize(o: any): ?number {
  43. if (o == null) {
  44. return null;
  45. }
  46. if (typeof o.size === 'number') {
  47. return o.size;
  48. }
  49. if (typeof o.length === 'number') {
  50. return o.length;
  51. }
  52. return null;
  53. }
  54. function referenceEquality<T>(one: T, two: T): boolean {
  55. return one === two;
  56. }
  57. module.exports = equalsIterable;