| 'use strict'; | 
| var call = require('../internals/function-call'); | 
| var create = require('../internals/object-create'); | 
| var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); | 
| 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 createIterResultObject = require('../internals/create-iter-result-object'); | 
| var iteratorClose = require('../internals/iterator-close'); | 
|   | 
| var TO_STRING_TAG = wellKnownSymbol('toStringTag'); | 
| var ITERATOR_HELPER = 'IteratorHelper'; | 
| var WRAP_FOR_VALID_ITERATOR = 'WrapForValidIterator'; | 
| var setInternalState = InternalStateModule.set; | 
|   | 
| var createIteratorProxyPrototype = function (IS_ITERATOR) { | 
|   var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER); | 
|   | 
|   return defineBuiltIns(create(IteratorPrototype), { | 
|     next: function next() { | 
|       var state = getInternalState(this); | 
|       // for simplification: | 
|       //   for `%WrapForValidIteratorPrototype%.next` or with `state.returnHandlerResult` our `nextHandler` returns `IterResultObject` | 
|       //   for `%IteratorHelperPrototype%.next` - just a value | 
|       if (IS_ITERATOR) return state.nextHandler(); | 
|       if (state.done) return createIterResultObject(undefined, true); | 
|       try { | 
|         var result = state.nextHandler(); | 
|         return state.returnHandlerResult ? result : createIterResultObject(result, state.done); | 
|       } catch (error) { | 
|         state.done = true; | 
|         throw error; | 
|       } | 
|     }, | 
|     'return': function () { | 
|       var state = getInternalState(this); | 
|       var iterator = state.iterator; | 
|       state.done = true; | 
|       if (IS_ITERATOR) { | 
|         var returnMethod = getMethod(iterator, 'return'); | 
|         return returnMethod ? call(returnMethod, iterator) : createIterResultObject(undefined, true); | 
|       } | 
|       if (state.inner) try { | 
|         iteratorClose(state.inner.iterator, 'normal'); | 
|       } catch (error) { | 
|         return iteratorClose(iterator, 'throw', error); | 
|       } | 
|       if (iterator) iteratorClose(iterator, 'normal'); | 
|       return createIterResultObject(undefined, true); | 
|     } | 
|   }); | 
| }; | 
|   | 
| var WrapForValidIteratorPrototype = createIteratorProxyPrototype(true); | 
| var IteratorHelperPrototype = createIteratorProxyPrototype(false); | 
|   | 
| createNonEnumerableProperty(IteratorHelperPrototype, TO_STRING_TAG, 'Iterator Helper'); | 
|   | 
| module.exports = function (nextHandler, IS_ITERATOR, RETURN_HANDLER_RESULT) { | 
|   var IteratorProxy = function Iterator(record, state) { | 
|     if (state) { | 
|       state.iterator = record.iterator; | 
|       state.next = record.next; | 
|     } else state = record; | 
|     state.type = IS_ITERATOR ? WRAP_FOR_VALID_ITERATOR : ITERATOR_HELPER; | 
|     state.returnHandlerResult = !!RETURN_HANDLER_RESULT; | 
|     state.nextHandler = nextHandler; | 
|     state.counter = 0; | 
|     state.done = false; | 
|     setInternalState(this, state); | 
|   }; | 
|   | 
|   IteratorProxy.prototype = IS_ITERATOR ? WrapForValidIteratorPrototype : IteratorHelperPrototype; | 
|   | 
|   return IteratorProxy; | 
| }; |