'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); 
 | 
  } 
 | 
}); 
 |