You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
			
				
					46 lines
				
				1.5 KiB
			
		
		
			
		
	
	
					46 lines
				
				1.5 KiB
			| 
											11 months ago
										 | 'use strict'; | ||
|  | var $ = require('../internals/export'); | ||
|  | var call = require('../internals/function-call'); | ||
|  | var aCallable = require('../internals/a-callable'); | ||
|  | var anObject = require('../internals/an-object'); | ||
|  | var getIteratorDirect = require('../internals/get-iterator-direct'); | ||
|  | var getIteratorFlattenable = require('../internals/get-iterator-flattenable'); | ||
|  | var createIteratorProxy = require('../internals/iterator-create-proxy'); | ||
|  | var iteratorClose = require('../internals/iterator-close'); | ||
|  | var IS_PURE = require('../internals/is-pure'); | ||
|  | 
 | ||
|  | var IteratorProxy = createIteratorProxy(function () { | ||
|  |   var iterator = this.iterator; | ||
|  |   var mapper = this.mapper; | ||
|  |   var result, inner; | ||
|  | 
 | ||
|  |   while (true) { | ||
|  |     if (inner = this.inner) try { | ||
|  |       result = anObject(call(inner.next, inner.iterator)); | ||
|  |       if (!result.done) return result.value; | ||
|  |       this.inner = null; | ||
|  |     } catch (error) { iteratorClose(iterator, 'throw', error); } | ||
|  | 
 | ||
|  |     result = anObject(call(this.next, iterator)); | ||
|  | 
 | ||
|  |     if (this.done = !!result.done) return; | ||
|  | 
 | ||
|  |     try { | ||
|  |       this.inner = getIteratorFlattenable(mapper(result.value, this.counter++), false); | ||
|  |     } catch (error) { iteratorClose(iterator, 'throw', error); } | ||
|  |   } | ||
|  | }); | ||
|  | 
 | ||
|  | // `Iterator.prototype.flatMap` method
 | ||
|  | // https://github.com/tc39/proposal-iterator-helpers
 | ||
|  | $({ target: 'Iterator', proto: true, real: true, forced: IS_PURE }, { | ||
|  |   flatMap: function flatMap(mapper) { | ||
|  |     anObject(this); | ||
|  |     aCallable(mapper); | ||
|  |     return new IteratorProxy(getIteratorDirect(this), { | ||
|  |       mapper: mapper, | ||
|  |       inner: null | ||
|  |     }); | ||
|  |   } | ||
|  | }); |