| 'use strict'; | 
| var InternalStateModule = require('../internals/internal-state'); | 
| var createIteratorConstructor = require('../internals/iterator-create-constructor'); | 
| var createIterResultObject = require('../internals/create-iter-result-object'); | 
| var isNullOrUndefined = require('../internals/is-null-or-undefined'); | 
| var isObject = require('../internals/is-object'); | 
| var defineBuiltInAccessor = require('../internals/define-built-in-accessor'); | 
| var DESCRIPTORS = require('../internals/descriptors'); | 
|   | 
| var INCORRECT_RANGE = 'Incorrect Iterator.range arguments'; | 
| var NUMERIC_RANGE_ITERATOR = 'NumericRangeIterator'; | 
|   | 
| var setInternalState = InternalStateModule.set; | 
| var getInternalState = InternalStateModule.getterFor(NUMERIC_RANGE_ITERATOR); | 
|   | 
| var $RangeError = RangeError; | 
| var $TypeError = TypeError; | 
|   | 
| var $RangeIterator = createIteratorConstructor(function NumericRangeIterator(start, end, option, type, zero, one) { | 
|   // TODO: Drop the first `typeof` check after removing legacy methods in `core-js@4` | 
|   if (typeof start != type || (end !== Infinity && end !== -Infinity && typeof end != type)) { | 
|     throw new $TypeError(INCORRECT_RANGE); | 
|   } | 
|   if (start === Infinity || start === -Infinity) { | 
|     throw new $RangeError(INCORRECT_RANGE); | 
|   } | 
|   var ifIncrease = end > start; | 
|   var inclusiveEnd = false; | 
|   var step; | 
|   if (option === undefined) { | 
|     step = undefined; | 
|   } else if (isObject(option)) { | 
|     step = option.step; | 
|     inclusiveEnd = !!option.inclusive; | 
|   } else if (typeof option == type) { | 
|     step = option; | 
|   } else { | 
|     throw new $TypeError(INCORRECT_RANGE); | 
|   } | 
|   if (isNullOrUndefined(step)) { | 
|     step = ifIncrease ? one : -one; | 
|   } | 
|   if (typeof step != type) { | 
|     throw new $TypeError(INCORRECT_RANGE); | 
|   } | 
|   if (step === Infinity || step === -Infinity || (step === zero && start !== end)) { | 
|     throw new $RangeError(INCORRECT_RANGE); | 
|   } | 
|   // eslint-disable-next-line no-self-compare -- NaN check | 
|   var hitsEnd = start !== start || end !== end || step !== step || (end > start) !== (step > zero); | 
|   setInternalState(this, { | 
|     type: NUMERIC_RANGE_ITERATOR, | 
|     start: start, | 
|     end: end, | 
|     step: step, | 
|     inclusive: inclusiveEnd, | 
|     hitsEnd: hitsEnd, | 
|     currentCount: zero, | 
|     zero: zero | 
|   }); | 
|   if (!DESCRIPTORS) { | 
|     this.start = start; | 
|     this.end = end; | 
|     this.step = step; | 
|     this.inclusive = inclusiveEnd; | 
|   } | 
| }, NUMERIC_RANGE_ITERATOR, function next() { | 
|   var state = getInternalState(this); | 
|   if (state.hitsEnd) return createIterResultObject(undefined, true); | 
|   var start = state.start; | 
|   var end = state.end; | 
|   var step = state.step; | 
|   var currentYieldingValue = start + (step * state.currentCount++); | 
|   if (currentYieldingValue === end) state.hitsEnd = true; | 
|   var inclusiveEnd = state.inclusive; | 
|   var endCondition; | 
|   if (end > start) { | 
|     endCondition = inclusiveEnd ? currentYieldingValue > end : currentYieldingValue >= end; | 
|   } else { | 
|     endCondition = inclusiveEnd ? end > currentYieldingValue : end >= currentYieldingValue; | 
|   } | 
|   if (endCondition) { | 
|     state.hitsEnd = true; | 
|     return createIterResultObject(undefined, true); | 
|   } return createIterResultObject(currentYieldingValue, false); | 
| }); | 
|   | 
| var addGetter = function (key) { | 
|   defineBuiltInAccessor($RangeIterator.prototype, key, { | 
|     get: function () { | 
|       return getInternalState(this)[key]; | 
|     }, | 
|     set: function () { /* empty */ }, | 
|     configurable: true, | 
|     enumerable: false | 
|   }); | 
| }; | 
|   | 
| if (DESCRIPTORS) { | 
|   addGetter('start'); | 
|   addGetter('end'); | 
|   addGetter('inclusive'); | 
|   addGetter('step'); | 
| } | 
|   | 
| module.exports = $RangeIterator; |