| 'use strict'; | 
| var InternalStateModule = require('../internals/internal-state'); | 
| var createIteratorConstructor = require('../internals/iterator-create-constructor'); | 
| var createIterResultObject = require('../internals/create-iter-result-object'); | 
| var hasOwn = require('../internals/has-own-property'); | 
| var objectKeys = require('../internals/object-keys'); | 
| var toObject = require('../internals/to-object'); | 
|   | 
| var OBJECT_ITERATOR = 'Object Iterator'; | 
| var setInternalState = InternalStateModule.set; | 
| var getInternalState = InternalStateModule.getterFor(OBJECT_ITERATOR); | 
|   | 
| module.exports = createIteratorConstructor(function ObjectIterator(source, mode) { | 
|   var object = toObject(source); | 
|   setInternalState(this, { | 
|     type: OBJECT_ITERATOR, | 
|     mode: mode, | 
|     object: object, | 
|     keys: objectKeys(object), | 
|     index: 0 | 
|   }); | 
| }, 'Object', function next() { | 
|   var state = getInternalState(this); | 
|   var keys = state.keys; | 
|   while (true) { | 
|     if (keys === null || state.index >= keys.length) { | 
|       state.object = state.keys = null; | 
|       return createIterResultObject(undefined, true); | 
|     } | 
|     var key = keys[state.index++]; | 
|     var object = state.object; | 
|     if (!hasOwn(object, key)) continue; | 
|     switch (state.mode) { | 
|       case 'keys': return createIterResultObject(key, false); | 
|       case 'values': return createIterResultObject(object[key], false); | 
|     } /* entries */ return createIterResultObject([key, object[key]], false); | 
|   } | 
| }); |