'use strict'; // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); var aFunction = require('../internals/a-function'); 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 IteratorProxy = createIteratorProxy(function (arg) { var iterator = this.iterator; var mapper = this.mapper; var result, mapped, iteratorMethod, innerIterator; while (true) { try { if (innerIterator = this.innerIterator) { result = anObject(this.innerNext.call(innerIterator)); if (!result.done) return result.value; this.innerIterator = this.innerNext = null; } result = anObject(this.next.call(iterator, arg)); if (this.done = !!result.done) return; mapped = mapper(result.value); iteratorMethod = getIteratorMethod(mapped); if (iteratorMethod === undefined) { throw TypeError('.flatMap callback should return an iterable object'); } this.innerIterator = innerIterator = anObject(iteratorMethod.call(mapped)); this.innerNext = aFunction(innerIterator.next); } catch (error) { iteratorClose(iterator); throw error; } } }); $({ target: 'Iterator', proto: true, real: true }, { flatMap: function flatMap(mapper) { return new IteratorProxy({ iterator: anObject(this), mapper: aFunction(mapper), innerIterator: null, innerNext: null }); } });