2 var global = require('../internals/global');
3 var InternalStateModule = require('../internals/internal-state');
4 var createIteratorConstructor = require('../internals/create-iterator-constructor');
5 var isObject = require('../internals/is-object');
6 var defineProperties = require('../internals/object-define-properties');
7 var DESCRIPTORS = require('../internals/descriptors');
9 var INCORRECT_RANGE = 'Incorrect Number.range arguments';
10 var NUMERIC_RANGE_ITERATOR = 'NumericRangeIterator';
12 var setInternalState = InternalStateModule.set;
13 var getInternalState = InternalStateModule.getterFor(NUMERIC_RANGE_ITERATOR);
15 var RangeError = global.RangeError;
16 var TypeError = global.TypeError;
18 var $RangeIterator = createIteratorConstructor(function NumericRangeIterator(start, end, option, type, zero, one) {
19 if (typeof start != type || (end !== Infinity && end !== -Infinity && typeof end != type)) {
20 throw new TypeError(INCORRECT_RANGE);
22 if (start === Infinity || start === -Infinity) {
23 throw new RangeError(INCORRECT_RANGE);
25 var ifIncrease = end > start;
26 var inclusiveEnd = false;
28 if (option === undefined) {
30 } else if (isObject(option)) {
32 inclusiveEnd = !!option.inclusive;
33 } else if (typeof option == type) {
36 throw new TypeError(INCORRECT_RANGE);
39 step = ifIncrease ? one : -one;
41 if (typeof step != type) {
42 throw new TypeError(INCORRECT_RANGE);
44 if (step === Infinity || step === -Infinity || (step === zero && start !== end)) {
45 throw new RangeError(INCORRECT_RANGE);
47 // eslint-disable-next-line no-self-compare -- NaN check
48 var hitsEnd = start != start || end != end || step != step || (end > start) !== (step > zero);
49 setInternalState(this, {
50 type: NUMERIC_RANGE_ITERATOR,
54 inclusiveEnd: inclusiveEnd,
63 this.inclusive = inclusiveEnd;
65 }, NUMERIC_RANGE_ITERATOR, function next() {
66 var state = getInternalState(this);
67 if (state.hitsEnd) return { value: undefined, done: true };
68 var start = state.start;
70 var step = state.step;
71 var currentYieldingValue = start + (step * state.currentCount++);
72 if (currentYieldingValue === end) state.hitsEnd = true;
73 var inclusiveEnd = state.inclusiveEnd;
76 endCondition = inclusiveEnd ? currentYieldingValue > end : currentYieldingValue >= end;
78 endCondition = inclusiveEnd ? end > currentYieldingValue : end >= currentYieldingValue;
81 return { value: undefined, done: state.hitsEnd = true };
82 } return { value: currentYieldingValue, done: false };
85 var getter = function (fn) {
86 return { get: fn, set: function () { /* empty */ }, configurable: true, enumerable: false };
90 defineProperties($RangeIterator.prototype, {
91 start: getter(function () {
92 return getInternalState(this).start;
94 end: getter(function () {
95 return getInternalState(this).end;
97 inclusive: getter(function () {
98 return getInternalState(this).inclusiveEnd;
100 step: getter(function () {
101 return getInternalState(this).step;
106 module.exports = $RangeIterator;