diff options
author | Graeme Yeates <yeatesgraeme@gmail.com> | 2016-07-21 15:51:17 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-07-21 15:51:17 -0400 |
commit | 98b11a4746433ca26a80a32d979363bed2d4ea35 (patch) | |
tree | 2042cb5c1e3ec3db8521ffe106b84e822f786c98 | |
parent | 0f75578d71d5aa9ae678e8736b3f8b4a02ec972c (diff) | |
parent | 422026db5d3dffafe9e7c5ca3289e3c9718eaf76 (diff) | |
download | async-98b11a4746433ca26a80a32d979363bed2d4ea35.tar.gz |
Merge pull request #1247 from caolan/iterator-jit
Make iterator more prone to JIT optimizations
-rw-r--r-- | lib/internal/iterator.js | 51 |
1 files changed, 29 insertions, 22 deletions
diff --git a/lib/internal/iterator.js b/lib/internal/iterator.js index 645dcbd..15c6fdd 100644 --- a/lib/internal/iterator.js +++ b/lib/internal/iterator.js @@ -2,33 +2,40 @@ import isArrayLike from 'lodash/isArrayLike'; import getIterator from './getIterator'; import keys from 'lodash/keys'; -export default function iterator(coll) { +function createArrayIterator(coll) { var i = -1; - var len; - if (isArrayLike(coll)) { - len = coll.length; - return function next() { - i++; - return i < len ? {value: coll[i], key: i} : null; - }; + var len = coll.length; + return function next() { + return ++i < len ? {value: coll[i], key: i} : null; } +} - var iterate = getIterator(coll); - if (iterate) { - return function next() { - var item = iterate.next(); - if (item.done) - return null; - i++; - return {value: item.value, key: i}; - }; +function createES2015Iterator(iterator) { + var i = -1; + return function next() { + var item = iterator.next(); + if (item.done) + return null; + i++; + return {value: item.value, key: i}; } +} - var okeys = keys(coll); - len = okeys.length; +function createObjectIterator(obj) { + var okeys = keys(obj); + var i = -1; + var len = okeys.length; return function next() { - i++; - var key = okeys[i]; - return i < len ? {value: coll[key], key: key} : null; + var key = okeys[++i]; + return i < len ? {value: obj[key], key: key} : null; }; } + +export default function iterator(coll) { + if (isArrayLike(coll)) { + return createArrayIterator(coll); + } + + var iterator = getIterator(coll); + return iterator ? createES2015Iterator(iterator) : createObjectIterator(coll); +} |