sugar
Version:
A Javascript utility library for working with native objects.
70 lines (65 loc) • 1.79 kB
JavaScript
;
var classChecks = require('../../common/var/classChecks'),
rangeIsValid = require('./rangeIsValid'),
incrementDate = require('./incrementDate'),
incrementNumber = require('./incrementNumber'),
incrementString = require('./incrementString'),
getGreaterPrecision = require('./getGreaterPrecision'),
getDateIncrementObject = require('./getDateIncrementObject');
var isNumber = classChecks.isNumber,
isString = classChecks.isString,
isDate = classChecks.isDate,
isFunction = classChecks.isFunction;
function rangeEvery(range, step, countOnly, fn) {
var increment,
precision,
dio,
unit,
start = range.start,
end = range.end,
inverse = end < start,
current = start,
index = 0,
result = [];
if (!rangeIsValid(range)) {
return countOnly ? NaN : [];
}
if (isFunction(step)) {
fn = step;
step = null;
}
step = step || 1;
if (isNumber(start)) {
precision = getGreaterPrecision(start, step);
increment = function() {
return incrementNumber(current, step, precision);
};
} else if (isString(start)) {
increment = function() {
return incrementString(current, step);
};
} else if (isDate(start)) {
dio = getDateIncrementObject(step);
step = dio[0];
unit = dio[1];
increment = function() {
return incrementDate(current, step, unit);
};
}
// Avoiding infinite loops
if (inverse && step > 0) {
step *= -1;
}
while(inverse ? current >= end : current <= end) {
if (!countOnly) {
result.push(current);
}
if (fn) {
fn(current, index, range);
}
current = increment();
index++;
}
return countOnly ? index - 1 : result;
}
module.exports = rangeEvery;