From 7cff1fa500b638b9e1c3b9292e2dceddaf6a5043 Mon Sep 17 00:00:00 2001 From: Mitar Date: Sun, 9 Jul 2017 11:24:12 -0700 Subject: [PATCH 1/4] Make Minimongo cursor iterable. --- packages/minimongo/minimongo.js | 36 +++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/packages/minimongo/minimongo.js b/packages/minimongo/minimongo.js index b97663a8a7..d68038f521 100644 --- a/packages/minimongo/minimongo.js +++ b/packages/minimongo/minimongo.js @@ -180,6 +180,42 @@ LocalCollection.Cursor.prototype.forEach = function (callback, thisArg) { }); }; +LocalCollection.Cursor.prototype[Symbol.iterator] = function () { + var self = this; + + var i = 0; + var objects = self._getRawObjects({ordered: true}); + + if (self.reactive) { + self._depend({ + addedBefore: true, + removed: true, + changed: true, + movedBefore: true}); + } + + return { + next: function () { + if (i < objects.length) { + // This doubles as a clone operation. + var elt = self._projectionFn(objects[i++]); + + if (self._transform) + elt = self._transform(elt); + + return { + value: elt + }; + } + else { + return { + done: true + }; + } + } + }; +}; + LocalCollection.Cursor.prototype.getTransform = function () { return this._transform; }; From 03819b02d11dd382ff1117b201b3ac1264011f6e Mon Sep 17 00:00:00 2001 From: Mitar Date: Wed, 19 Jul 2017 10:08:50 -0700 Subject: [PATCH 2/4] Made it conditional. --- packages/minimongo/minimongo.js | 64 +++++++++++++++++---------------- 1 file changed, 33 insertions(+), 31 deletions(-) diff --git a/packages/minimongo/minimongo.js b/packages/minimongo/minimongo.js index d68038f521..e3e163ad67 100644 --- a/packages/minimongo/minimongo.js +++ b/packages/minimongo/minimongo.js @@ -180,41 +180,43 @@ LocalCollection.Cursor.prototype.forEach = function (callback, thisArg) { }); }; -LocalCollection.Cursor.prototype[Symbol.iterator] = function () { - var self = this; +if (typeof Symbol !== 'undefined' && Symbol.iterator) { + LocalCollection.Cursor.prototype[Symbol.iterator] = function () { + var self = this; - var i = 0; - var objects = self._getRawObjects({ordered: true}); + var i = 0; + var objects = self._getRawObjects({ordered: true}); - if (self.reactive) { - self._depend({ - addedBefore: true, - removed: true, - changed: true, - movedBefore: true}); - } - - return { - next: function () { - if (i < objects.length) { - // This doubles as a clone operation. - var elt = self._projectionFn(objects[i++]); - - if (self._transform) - elt = self._transform(elt); - - return { - value: elt - }; - } - else { - return { - done: true - }; - } + if (self.reactive) { + self._depend({ + addedBefore: true, + removed: true, + changed: true, + movedBefore: true}); } + + return { + next: function () { + if (i < objects.length) { + // This doubles as a clone operation. + var elt = self._projectionFn(objects[i++]); + + if (self._transform) + elt = self._transform(elt); + + return { + value: elt + }; + } + else { + return { + done: true + }; + } + } + }; }; -}; +} LocalCollection.Cursor.prototype.getTransform = function () { return this._transform; From d1f891f462cd6a061b34b65238df82345831e9d7 Mon Sep 17 00:00:00 2001 From: Mitar Date: Thu, 17 Aug 2017 02:16:45 -0700 Subject: [PATCH 3/4] Added tests. --- packages/minimongo/minimongo_tests_client.js | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/packages/minimongo/minimongo_tests_client.js b/packages/minimongo/minimongo_tests_client.js index 430b4c084e..ca912ab0e8 100644 --- a/packages/minimongo/minimongo_tests_client.js +++ b/packages/minimongo/minimongo_tests_client.js @@ -220,6 +220,17 @@ Tinytest.add('minimongo - cursors', test => { // call it again, it still works test.length(q.fetch(), 20); + // iterator + count = 0; + for (let obj of q) { + test.equal(obj.i, count++); + }; + test.equal(count, 20); + // call it again, it still works + test.length(q.fetch(), 20); + // test spread operator + test.equal([...q], q.fetch()); + // map res = q.map(function(obj, i, cursor) { test.equal(obj.i, i); From 958c0298219c40546a987eeae000b1d48805d0dc Mon Sep 17 00:00:00 2001 From: Mitar Date: Thu, 17 Aug 2017 02:21:12 -0700 Subject: [PATCH 4/4] Added History entry. --- History.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.md b/History.md index 66611a6eab..9f2df019b5 100644 --- a/History.md +++ b/History.md @@ -1,5 +1,9 @@ ## v.NEXT +* Minimongo cursors are now JavaScript iterable objects and can now be iterated over + using `for...of` loops, spread operator, `yield*`, and destructuring assignments. + [PR #8888](https://github.com/meteor/meteor/pull/8888) + * The `star.json` manifest created within the root of a `meteor build` bundle will now contain `nodeVersion` and `npmVersion` which will specify the exact versions of Node.js and npm (respectively) which the Meteor release was