UNPKG

sugar

Version:

A Javascript utility library for working with native objects.

70 lines (65 loc) 1.79 kB
'use strict'; 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;