import { mathCeil, mathMax } from './internals/native';
import isNil from './isNil';
import toFinite from './toFinite';
/**
* 创建一个升序或降序的数字数组。
*
* 如果省略 `start` 默认为 `0`。
*
* @function
* @alias module:Util.range
* @since 1.6.0
* @param {number} [start=0] 开始值。默认 `0`。
* @param {number} end 结束值。
* @param {number} [step] 要增加或减少的值。如果值为 `0`,将视为无效参数。如果 `start` 在 `end` 之前。默认为 `1`,否则默认为 `-1`。
* @return {number[]} 从开始值(包含)到结束值(不包含)逐步递增或递减的数字数组。
* @example
*
* range(4); // [0, 1, 2, 3]
* range(-4); // [0, -1, -2, -3]
* range(1, 5); // [1, 2, 3, 4]
* range(0, 20, 5); // [0, 5, 10, 15]
* range(0, -4, -1); // [1, 2, 3]
* range(1, 4, 0); // [1, 2, 3]
* range(0); // []
*/
const range = function (start, end, step) {
start = toFinite(start);
if (isNil(end)) {
end = start;
start = 0;
}
else {
end = toFinite(end);
}
step = toFinite(step);
// 值为 0, '', null, undefined 时
if (!step) {
step = start < end ? 1 : -1;
}
let index = -1;
let length = mathMax(mathCeil((end - start) / step), 0);
const result = Array(length);
while (length--) {
result[++index] = start;
start += step;
}
return result;
};
export default range;