esnext.iterator.flat-map.js 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. 'use strict';
  2. var $ = require('../internals/export');
  3. var call = require('../internals/function-call');
  4. var aCallable = require('../internals/a-callable');
  5. var anObject = require('../internals/an-object');
  6. var getIteratorDirect = require('../internals/get-iterator-direct');
  7. var getIteratorFlattenable = require('../internals/get-iterator-flattenable');
  8. var createIteratorProxy = require('../internals/iterator-create-proxy');
  9. var iteratorClose = require('../internals/iterator-close');
  10. var IteratorProxy = createIteratorProxy(function () {
  11. var iterator = this.iterator;
  12. var mapper = this.mapper;
  13. var result, inner;
  14. while (true) {
  15. if (inner = this.inner) try {
  16. result = anObject(call(inner.next, inner.iterator));
  17. if (!result.done) return result.value;
  18. this.inner = null;
  19. } catch (error) { iteratorClose(iterator, 'throw', error); }
  20. result = anObject(call(this.next, iterator));
  21. if (this.done = !!result.done) return;
  22. try {
  23. this.inner = getIteratorFlattenable(mapper(result.value, this.counter++));
  24. } catch (error) { iteratorClose(iterator, 'throw', error); }
  25. }
  26. });
  27. // `Iterator.prototype.flatMap` method
  28. // https://github.com/tc39/proposal-iterator-helpers
  29. $({ target: 'Iterator', proto: true, real: true }, {
  30. flatMap: function flatMap(mapper) {
  31. anObject(this);
  32. aCallable(mapper);
  33. return new IteratorProxy(getIteratorDirect(this), {
  34. mapper: mapper,
  35. inner: null
  36. });
  37. }
  38. });