| 'use strict'; |
| |
| var setPrototypeOf = require('es5-ext/object/set-prototype-of') |
| , d = require('d') |
| , Iterator = require('../') |
| , validIterable = require('../valid-iterable') |
| |
| , push = Array.prototype.push |
| , defineProperties = Object.defineProperties |
| , IteratorChain; |
| |
| IteratorChain = function (iterators) { |
| defineProperties(this, { |
| __iterators__: d('', iterators), |
| __current__: d('w', iterators.shift()) |
| }); |
| }; |
| if (setPrototypeOf) setPrototypeOf(IteratorChain, Iterator); |
| |
| IteratorChain.prototype = Object.create(Iterator.prototype, { |
| constructor: d(IteratorChain), |
| next: d(function () { |
| var result; |
| if (!this.__current__) return { done: true, value: undefined }; |
| result = this.__current__.next(); |
| while (result.done) { |
| this.__current__ = this.__iterators__.shift(); |
| if (!this.__current__) return { done: true, value: undefined }; |
| result = this.__current__.next(); |
| } |
| return result; |
| }) |
| }); |
| |
| module.exports = function () { |
| var iterators = [this]; |
| push.apply(iterators, arguments); |
| iterators.forEach(validIterable); |
| return new IteratorChain(iterators); |
| }; |