| | |
| | | 'use strict'; |
| | | // https://github.com/tc39/proposal-iterator-helpers |
| | | var $ = require('../internals/export'); |
| | | var global = require('../internals/global'); |
| | | var call = require('../internals/function-call'); |
| | | var aCallable = require('../internals/a-callable'); |
| | | var anObject = require('../internals/an-object'); |
| | | var getIteratorMethod = require('../internals/get-iterator-method'); |
| | | var createIteratorProxy = require('../internals/iterator-create-proxy'); |
| | | var iteratorClose = require('../internals/iterator-close'); |
| | | |
| | | var TypeError = global.TypeError; |
| | | |
| | | var IteratorProxy = createIteratorProxy(function () { |
| | | var iterator = this.iterator; |
| | |
| | | while (true) { |
| | | try { |
| | | if (innerIterator = this.innerIterator) { |
| | | result = anObject(this.innerNext.call(innerIterator)); |
| | | result = anObject(call(this.innerNext, innerIterator)); |
| | | if (!result.done) return result.value; |
| | | this.innerIterator = this.innerNext = null; |
| | | } |
| | | |
| | | result = anObject(this.next.call(iterator)); |
| | | result = anObject(call(this.next, iterator)); |
| | | |
| | | if (this.done = !!result.done) return; |
| | | |
| | |
| | | throw TypeError('.flatMap callback should return an iterable object'); |
| | | } |
| | | |
| | | this.innerIterator = innerIterator = anObject(iteratorMethod.call(mapped)); |
| | | this.innerIterator = innerIterator = anObject(call(iteratorMethod, mapped)); |
| | | this.innerNext = aCallable(innerIterator.next); |
| | | } catch (error) { |
| | | iteratorClose(iterator, 'throw', error); |
| | |
| | | } |
| | | }); |
| | | |
| | | $({ target: 'Iterator', proto: true, real: true }, { |
| | | $({ target: 'Iterator', proto: true, real: true, forced: true }, { |
| | | flatMap: function flatMap(mapper) { |
| | | return new IteratorProxy({ |
| | | iterator: anObject(this), |