| | |
| | | 'use strict'; |
| | | var call = require('../internals/function-call'); |
| | | var aCallable = require('../internals/a-callable'); |
| | | var anObject = require('../internals/an-object'); |
| | | var create = require('../internals/object-create'); |
| | | var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); |
| | | var redefineAll = require('../internals/redefine-all'); |
| | | var defineBuiltIns = require('../internals/define-built-ins'); |
| | | var wellKnownSymbol = require('../internals/well-known-symbol'); |
| | | var InternalStateModule = require('../internals/internal-state'); |
| | | var getMethod = require('../internals/get-method'); |
| | | var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype; |
| | | |
| | | var ITERATOR_PROXY = 'IteratorProxy'; |
| | | var setInternalState = InternalStateModule.set; |
| | | var getInternalState = InternalStateModule.get; |
| | | var getInternalState = InternalStateModule.getterFor(ITERATOR_PROXY); |
| | | |
| | | var TO_STRING_TAG = wellKnownSymbol('toStringTag'); |
| | | |
| | | module.exports = function (nextHandler, IS_ITERATOR) { |
| | | var IteratorProxy = function Iterator(state) { |
| | | state.type = ITERATOR_PROXY; |
| | | state.next = aCallable(state.iterator.next); |
| | | state.done = false; |
| | | state.ignoreArg = !IS_ITERATOR; |
| | | setInternalState(this, state); |
| | | }; |
| | | |
| | | IteratorProxy.prototype = redefineAll(create(IteratorPrototype), { |
| | | IteratorProxy.prototype = defineBuiltIns(create(IteratorPrototype), { |
| | | next: function next(arg) { |
| | | var state = getInternalState(this); |
| | | var args = arguments.length ? [state.ignoreArg ? undefined : arg] : IS_ITERATOR ? [] : [undefined]; |
| | | state.ignoreArg = false; |
| | | var result = state.done ? undefined : nextHandler.call(state, args); |
| | | var result = state.done ? undefined : call(nextHandler, state, args); |
| | | return { done: state.done, value: result }; |
| | | }, |
| | | 'return': function (value) { |
| | |
| | | var iterator = state.iterator; |
| | | state.done = true; |
| | | var $$return = getMethod(iterator, 'return'); |
| | | return { done: true, value: $$return ? anObject($$return.call(iterator, value)).value : value }; |
| | | return { done: true, value: $$return ? anObject(call($$return, iterator, value)).value : value }; |
| | | }, |
| | | 'throw': function (value) { |
| | | var state = getInternalState(this); |
| | | var iterator = state.iterator; |
| | | state.done = true; |
| | | var $$throw = getMethod(iterator, 'throw'); |
| | | if ($$throw) return $$throw.call(iterator, value); |
| | | if ($$throw) return call($$throw, iterator, value); |
| | | throw value; |
| | | } |
| | | }); |